Swift 之可选类型

语言特性

Swift中要求变量或常量在声明时就要初始化其值,如果没有初始化赋值,就必须使用可选类型。

    var newItemVisible:Bool = false
    var toBuyItems = [ DeviceItem(itemName: "Appo_1",itemIp: "192.168.1.101"),
                       DeviceItem(itemName: "Appo_2",itemIp: "192.168.0.118"),
                       DeviceItem(itemName: "Appo_2",itemIp: "192.168.0.107")
                     ]
    let newitem = DeviceItem(itemName: "New",itemIp: "192.168.1.120")
    // 上面三个变量,在初始化的时候都有赋值,所有可以不使用可选类型。
    var udpclient: UDPClient?
    //上面的变量由于没有初始化,所以必须使用可选类型。

使用例子代码:

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
/*
    wrong sentence:
        failed to covert Int? to Int
 */
//let convertedNumber2: Int = Int(possibleNumber)

let convertedNumber3: Int? = Int(possibleNumber)

let convertedNumber4: Optional = Int(possibleNumber)

也就是说 Int? 是一种返回类型,可能是Int 也可能是nil。如果一个函数返回值是Int? ,赋值给Int 变量是会报错的。 Int? 等价于 Optional

-那么对于可选类型,?和!又是什么区别呢??
一般我们在以下两种情况会遇到它们:

1.申明变量时

var number: Int?
var str: String?

在声明一个变量时,如果不手动初始化,Swift不会自动初始化该变量为一个默认值的。

但是对于Optional的变量则不同,Optional的变量在声明时如果不初始化,Swift会自动将该变量初始化为nil。声明变量时在类型后添加?或者!,就是告诉编译器这是一个Optional的变量,如果没有初始化,你就将其初始化为nil

但是这两者之间还是有一些区别的,声明变量时的?只是单纯的告诉Swift这是Optional的,如果没有初始化就默认为nil,而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。

2.在对变量操作时

number?.hashValue
str!.hashValue
var arrayCount = dataList?.count

这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。

var arrayCount = dataList!.count

这里的叹号和之前的问号则不同,这里表示我确定dataList一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让dataList为nil,程序就会crash掉。

3.总结

  • 问号?
    a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
    b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
  • 叹号!
    a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
    b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理

你可能感兴趣的:(Swift 之可选类型)