optional解析之String, String?, String!

声明变量时,如果使用String? 或者 String!,则该变量的类型都是optional string
两者的区别在于,使用String!声明的变量,在使用的时候,不需要显示的解包;编译器会帮我们强制解包。这也就要求使用者需要确保该变量在引用的时候,必须是非nil值。示例:

1
2
3
4
5
let a:String? = "a"
let b:String! = "b"
let c:String = "c"

print(a!+b+c) //打印abc

需要注意的是,在打印、显示在ui上的时候,系统会自动为optional类型在上Optional(“xxx”)字样,如:

1
2
3
4
5
let 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
5
let a:String? = "a"
let b:String! = "b"
let c:String = "c"

print("\(a!)\(b!)\(c)") //打印"abc\n"

Contents
,