我试图在斯威夫特的一个班级中讽刺.这可能吗?这是我尝试使用的代码:
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)
我不确定你想要实现什么,但这是你的例子的工作版本:
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)
该x as! Y.Type语法仅在明确说明 Y 时才有效。
所以,编译器想要x as! NSString. 编译器崩溃是一个错误,我建议您提交报告。
想一想,这对你有什么帮助?stringClass类型为,AnyClass并且您正在强制转换已经AnyObject符合. 当您考虑静态类型时,应该进行强制转换,因为否则强制转换实际上没有任何意义。AnyClass
但是,如果您想检查对象的类是否是特定类型的子类,您可以使用:
x is Y.Type