类动态快速转换

Ale*_*ran 8 casting swift

我试图在斯威夫特的一个班级中讽刺.这可能吗?这是我尝试使用的代码:

let stringClass: AnyClass = NSString.self
let anyObject: AnyObject = "foo"
let string = anyObject as! stringClass
Run Code Online (Sandbox Code Playgroud)

代码无法在演员表中编译.这是可能的,如果是这样,为什么正确的语法?

真实用例

这是真正的问题.我试图重构这段代码:

switch (value) {
    case "valueOne":
        viewController = storyboard.instantiateViewController(withIdentifier: "foo") as! FirstViewController
    case "valueTwo":
        viewController = storyboard.instantiateViewController(withIdentifier: "bar") as! SecondViewController
    default:
        return nil
}
Run Code Online (Sandbox Code Playgroud)

成:

let controllersDictionary: [String: (String, UIViewController.Type)] = [
    "valueOne" : ("bar", FirstViewController.self),
    "valueTwo" : ("foo", SecondViewController.self)
]
let tuple = controllersDictionary[value]!
let identifier = tuple.0
let cast = tuple.1
let viewController = storyboard.instantiateViewController(withIdentifier: identifier) as! cast
Run Code Online (Sandbox Code Playgroud)

Ale*_*ica 6

我不确定你想要实现什么,但这是你的例子的工作版本:

func cast<T>(value: Any, to type: T) -> T? {
    return castedValue as? T
}

let inputValue: Any = "this is a test"
let inputType = String.self()
let casted = cast(value: inputValue, to: inputType)

print(casted)
Run Code Online (Sandbox Code Playgroud)


Vat*_*not 0

x as! Y.Type语法仅在明确说明 Y 时才有效。

所以,编译器想要x as! NSString. 编译器崩溃是一个错误,我建议您提交报告。

想一想,这对你有什么帮助?stringClass类型为,AnyClass并且您正在强制转换已经AnyObject符合. 当您考虑静态类型时,应该进行强制转换,因为否则强制转换实际上没有任何意义。AnyClass

但是,如果您想检查对象的类是否是特定类型的子类,您可以使用:

x is Y.Type

  • “当你想到静态类型时,你应该进行强制转换,因为否则强制转换实际上没有任何意义。” 确切地。如果静态类型系统的其余部分不知道您的动态类型,那么它有什么好处呢? (2认同)