Class casting dynamically in swift

后端 未结 5 2015
慢半拍i
慢半拍i 2021-02-19 15:11

I am trying to dyanmically cast to a class in Swift. Is this possible? Here is the code I am trying to use:

let stringClass: AnyClass = NSString.self
let anyObje         


        
5条回答
  •  孤城傲影
    2021-02-19 15:51

    Its possible so long as you can provide "a hint" to the compiler about the type of... T. So in the example below one must use : String?.

    func cast(_ value: Any) -> T? {
        return value as? T
    }
    
    let inputValue: Any = "this is a test"
    let casted: String? = cast(inputValue) 
    print(casted) // Optional("this is a test")
    print(type(of: casted)) // Optional
    

    Why Swift doesn't just allow us to let casted = cast(inputValue) I'll never know.


    One annoying scenerio is when your func has no return value. Then its not always straightford to provide the necessary "hint". Lets look at this example...

    func asyncCast(_ value: Any, completion: (T?) -> Void) {
        completion(value as? T)
    }
    

    The following client code DOES NOT COMPILE. It gives a "Generic parameter 'T' could not be inferred" error.

    let inputValue: Any = "this is a test"
    asyncCast(inputValue) { casted in
        print(casted) 
        print(type(of: casted))
    }
    

    But you can solve this by providing a "hint" to compiler as follows:

    asyncCast(inputValue) { (casted: String?) in
        print(casted) // Optional("this is a test")
        print(type(of: casted)) // Optional
    }
    

提交回复
热议问题