我正在尝试制作一个函数,该函数接收View Controller的名称(字符串),然后以模态形式显示该View Controller。示例:
func presentViewControllerModally(newViewControllerName: String){
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "\(newViewControllerName)_Identifier") as! newViewControllerName
self.present(newViewController, animated: false, completion: nil)
}
但是我无法使强制转换as! newViewControllerName
像newViewControllerName
是一种类型(而不是String类型的对象)一样工作。
答案 0 :(得分:2)
您所描述的内容(使用as
无效,但更重要的是,即使它确实有效,也将毫无用处。
让我们想象一下它确实有效,并且您可以编写如下代码:
let myValue: Any = functionThatReturnsAnAny()
let myType: String = functionThatReturnsAString()
let castedValue = myValue as! myType
现在呢? castedValue
可能会做什么?您不知道它是什么类型。没有可以调用的方法。没有什么可以传递给它的。 castedValue
与myValue
有什么不同,除了您创建了一种使程序崩溃的新方式之外。 (当您发现自己使用as!
时,通常会在Swift中走错路。有几次是必要的或适当的,但这种情况很少见。)
暂时忘记字符串,将其提升一个层次。假设您只想返回一个实型(但在编译时未知)?
let myValue: Any = functionThatReturnsAnAny()
let myType: Any.Type = functionThatReturnsAType()
let castedValue = myValue as! myType
此静止没有任何意义。您没有关于castedValue
的信息,而您还没有myValue
的信息。
类型本身并不存在。它们的存在是为了告诉我们可以用值做什么;它具有什么方法以及可以传递给什么功能。仅当您实际上要编写使用这些事实的代码时才有意义,这意味着您已经需要知道期望的类型。如果您知道期望的是哪种类型,那么正如其他人回答的那样,正确的方法是使用switch
或if
。
答案 1 :(得分:1)
实际上,这比您想象的要容易得多。
可以使用switch
或if else
语句代替将字符串“强制转换”为类型。
答案 2 :(得分:1)
我不确定铸造是一个好主意(甚至可能)...也许像
let myType = "Int"
if myType == "Int" {
return Int.self
}
会工作。否则,您可以创建一个枚举:
enum TypesToCheck: String {
case int = "Int"
case string = "String"
...
}
let myString = "Int"
let myType = TypesToCheck(rawValue: myString)!
switch myType {
case .int:
print(Int.self)
case .string:
print(String.self)
}
请注意,强制展开不是一个好的解决方案,我只是在这里举例。
希望有帮助