Check if `Any` value is object

前端 未结 2 2007
终归单人心
终归单人心 2020-11-27 06:59

I was surprised to find that this condition is always true:

let foo: Any = 4
if let object = foo as? AnyObject {
    print(\"It\'s an object.\")
    //do som         


        
2条回答
  •  粉色の甜心
    2020-11-27 07:42

    Perhaps you want to look at Mirror which allows a degree of introspection. Documentation is here

    import Foundation
    
    func prettyPrint(_ any: Any) -> String {
        let m = Mirror(reflecting: any)
        switch m.displayStyle {
        case .some(.class): // ****
            return "Class"
        case .some(.collection):
            return "Collection, \(m.children.count) elements"
        case .some(.tuple):
            return "Tuple, \(m.children.count) elements"
        case .some(.dictionary):
            return "Dictionary, \(m.children.count) elements"
        case .some(.set):
            return "Set, \(m.children.count) elements"
        case .some(.optional):
            return "Optional"
        case .some(.enum):
            return "Enum"
        case .some(.struct):
            return "Struct"
        default:
            return "\(String(describing: m.displayStyle))"
        }
    }
    class A {}
    
    prettyPrint([1, 2, 3]) // "Collection, 3 elements"
    prettyPrint(Set()) // "Set, 0 elements"
    prettyPrint([1: 2, 3: 4]) // "Dictionary, 2 elements"
    prettyPrint((1, 2, 3)) // "Tuple, 3 elements"
    prettyPrint(3) // "nil"
    prettyPrint("3") // "nil"
    prettyPrint(NSObject()) // "Class"
    prettyPrint(NSArray(array:[1, 2, 3])) // "Collection, 3 elements"
    prettyPrint(A()) // "Class"
    
    // prettyPrint(nil) // Compile time error "Nil is not compatible with Any
    

提交回复
热议问题