我的代码尝试检查变量的类型有什么问题?
以下代码产生的错误说“'是'测试始终为真”。请注意,我不想将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")
}
这是编译器错误吗?如果不是我做错了什么?
答案 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")
}