试图检查变量类型的代码出了什么问题?

时间:2014-06-22 17:55:54

标签: swift

我的代码尝试检查变量的类型有什么问题?

以下代码产生的错误说“'是'测试始终为真”。请注意,我不想将p设置为值,因为它可能是nil,因此使用可选。

import Foundation

var p:String?

if p as String? {
    println("p is a string type")
}
else {
    println("p is not a string type")
}

现在如果我测试String类型,它甚至不会编译:

 import Foundation

    var p:String?

    if p as String {
        println("p is a string type")
    }
    else {
        println("p is not a string type")
    }

这是编译器错误吗?如果不是我做错了什么?

3 个答案:

答案 0 :(得分:1)

您已经知道p是一个可选字符串。您无需将其转换为类型,只需执行Optional Binding

即可
if let aString = p {
    println("p is a string: \(aString)")
}
else {
    println("p is nil")
}

通常使用as?运算符检查变量是否属于某种类型:

var something : AnyObject = "Hello"

if let aString = something as? String {
    println("something is a string: \(aString)")
}

但是在检查可选项是否为nil时不使用该机制。

如果您的对象是可选对象,这也可以使用:

var something : AnyObject? = "Hello"

if let aString = something as? String {
    println("something is a string: \(aString)")
}

答案 1 :(得分:1)

添加围绕可选绑定的答案,Apple提供了一种更直接的方式。

is运算符完全存在于此目的。但是,它不允许您测试琐碎的案例,而是测试子类。 您可以像这样使用is

let a : Any = "string"

if a is String {
    println("yes")
}
else {
    println("no")
}

正如预期的那样,打印yes

答案 2 :(得分:0)

由于p是一个可选字符串,您可以在条件测试中使用它,如下所示:

import Foundation

var p: String?

if p {
    println("p has been assigned a String value")
}
else {
    println("p is nil")
}

如果为p分配了一个字符串值,并且您希望在if语句的正文中使用该值,那么您可以使用'可选绑定'将其值赋给您可以使用的局部常量:

if let pValue = p {
    println("p is assigned \(pValue)")
}
else {
    println("p is nil")
}