声明变量时,如果使用String? 或者 String!,则该变量的类型都是optional string
两者的区别在于,使用String!声明的变量,在使用的时候,不需要显示的解包;编译器会帮我们强制解包。这也就要求使用者需要确保该变量在引用的时候,必须是非nil值。示例:
1 | let a:String? = "a" |
需要注意的是,在打印、显示在ui上的时候,系统会自动为optional类型在上Optional(“xxx”)字样,如:1
2
3
4
5let a:String? = "a"
let b:String! = "b"
let c:String = "c"
print("\(a)\(b)\(c)") //打印"Optional("a")Optional("b")c\n"
所以,大部分情况下,我们需要显示的解包,才能达到自己想要的效果:1
2
3
4
5let a:String? = "a"
let b:String! = "b"
let c:String = "c"
print("\(a!)\(b!)\(c)") //打印"abc\n"