是否可以使编译器将VC名称视为VC类型?

时间:2019-02-05 15:38:22

标签: swift

我正在尝试制作一个函数,该函数接收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! newViewControllerNamenewViewControllerName是一种类型(而不是String类型的对象)一样工作。

3 个答案:

答案 0 :(得分:2)

您所描述的内容(使用as无效,但更重要的是,即使它确实有效,也将毫无用处。

让我们想象一下它确实有效,并且您可以编写如下代码:

let myValue: Any = functionThatReturnsAnAny()
let myType: String = functionThatReturnsAString()
let castedValue = myValue as! myType

现在呢? castedValue可能会做什么?您不知道它是什么类型。没有可以调用的方法。没有什么可以传递给它的。 castedValuemyValue有什么不同,除了您创建了一种使程序崩溃的新方式之外。 (当您发现自己使用as!时,通常会在Swift中走错路。有几次是必要的或适当的,但这种情况很少见。)

暂时忘记字符串,将其提升一个层次。假设您只想返回一个实型(但在编译时未知)?

let myValue: Any = functionThatReturnsAnAny()
let myType: Any.Type = functionThatReturnsAType()
let castedValue = myValue as! myType

静止没有任何意义。您没有关于castedValue的信息,而您还没有myValue的信息。

类型本身并不存在。它们的存在是为了告诉我们可以用值做什么;它具有什么方法以及可以传递给什么功能。仅当您实际上要编写使用这些事实的代码时才有意义,这意味着您已经需要知道期望的类型。如果您知道期望的是哪种类型,那么正如其他人回答的那样,正确的方法是使用switchif

答案 1 :(得分:1)

实际上,这比您想象的要容易得多。

可以使用switchif 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)
}

请注意,强制展开不是一个好的解决方案,我只是在这里举例。

希望有帮助