【发布时间】:2023-03-27 09:23:01
【问题描述】:
我正在尝试在 Swift 中动态转换为一个类。这可能吗?这是我尝试使用的代码:
let stringClass: AnyClass = NSString.self
let anyObject: AnyObject = "foo"
let string = anyObject as! stringClass
代码在强制转换时无法编译。这可能吗?如果可以,为什么是正确的语法?
实际用例
这是真正的问题。我正在尝试重构此代码:
switch (value) {
case "valueOne":
viewController = storyboard.instantiateViewController(withIdentifier: "foo") as! FirstViewController
case "valueTwo":
viewController = storyboard.instantiateViewController(withIdentifier: "bar") as! SecondViewController
default:
return nil
}
进入:
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
【问题讨论】:
-
动态转换在静态类型系统中是否有意义?
-
是的!在这种情况下,我们的目标是在特定条件下转换为不同的类型(考虑从故事板实例化多个不同的 ViewController)
-
这个问题通常使用关联类型或泛型来解决。
-
“想想从情节提要中实例化多个不同的 ViewControllers” 我的想象力失败了。您能否展示那个代码,以便我们了解真正的实际问题是什么?
-
@AlexCurran 我仍然不明白你为什么在那一刻需要演员表。为什么标识符不够?
viewController实际上将自动成为右视图控制器子类的实例,那么强制转换是为了什么?