首先贴cocoachina上某位大大的帖子:
1
2
3
4
5 |
var stringValue : String //error: variable ‘stringValue‘ used before being initialized //let hashValue = stringValue.hashValue // ^ let hashValue = stringValue.hashValue |
1
2
3
4
5
6
7
8
9
10
11
12
13 |
enum
Optional<T> : LogicValue, Reflectable { case
None case
Some(T) init() init(_ some: T) /// Allow use in a Boolean context. func getLogicValue() -> Bool /// Haskell‘s fmap, which was mis-named func map<U>(f: (T) -> U) -> U? func getMirror() -> Mirror } |
1 |
var strValue : String? |
1
2
3 |
if
strValue { //do sth with strValue } |
1 |
let hashValue = strValue?.hashValue |
1
2
3
4
5 |
//error: ‘String?‘ does not have a member named ‘hashValue‘ //let hashValue = strValue.hashValue // ^ ~~~~~~~~~ let hashValue = strValue.hashValue |
1
2
3 |
if
let str = strValue { let hashValue = str.hashValue } |
1 |
let hashValue = strValue!.hashValue |
1
2
3 |
if
strValue { let hashValue = strValue!.hashValue } |
1
2
3 |
myLabel!.text = "text" myLabel!.frame = CGRectMake(0, 0, 10, 10) ... |
swift中的?和!使用起来其实并不像大家所说的那么费劲,简单理解主要包括以下几个要点:
1,如果你使用?就表面你可以允许你参数赋值为nil。这个时候在使用该参数用于赋值等操作的时候必须加上!或者是加入官方说明的if判断
func testStr(){
var str:String? = "hello"
//var result = str + "world"//编译错误,这个地方必须要加上!因为str可能是nil,如果nil的话下面的语句是不通的
var result = str! + "world"//如果要使用str,要加入!,确保编译通过
str = nil
//result = str! + "world" //运行错误,因为?表示该参数可能为nil,这个时候,程序是可以进行赋值为nil操作的,所以在做操作的时候,需要做判断处理
if let isnull=str{
println("str is not null");
}else{
println("str is null");
}
}
结果:str is null
2,!表示你定义的参数是不为null的。这个时候,虽然可以进行赋值为nil的操作,但是一旦你进行了赋值nil操作是编译不过的
func testStr(){
var str:String! = "hello"
var result = str + "world"//没有问题,这个地方因为定义的是!,所以str肯定不为空,改语句成立
str = nil
result = str + "world"//编译通过,但是运行时出错
result = str! + "world"//编译通过,但是运行时出错。
if let isnull=str{
println("str is not null");
}else{
println("str is null");
}
}
3,如果不适用!和?操作
func testStr(){
var str:String = "hello"
var result = str + "world"//没有问题
//str = nil //这个地方是不可以进行赋值为nil操作的。
//result = str? + "world"//编译不通过
//result = str! + "world"//编译不通过
iflet isnull=str{// 这个地方就不能这样用了,因为这种用法只使用于Optional type
println("str is not null");
}else{
println("str is null");
}
}
原文:http://www.cnblogs.com/dugulong/p/3770367.html