本次内容:
- 元组
- 可选类型简介
- 可选解包
- 可选链
元组
Swift中提供了一种OC中没有的高级类型元组。你可以把多种不同类型的值放在元组中。元组多用于一个方法当它有多组返回值的时候可以使用。举个例子:
let company = ("AAPL","Apple Inc",93.5)
当我们要取出元组中的某个值时可以使用元组的索引,比如:
let companyName = company.1 //此时companyName = "Apple Inc"
若不想使用索引,还可以这样:
let company = (stockCode:"AAPL",companyName:"Apple Inc",price:93.5)
print(company.stockCode) //输出公司的股票代码
当然,我们要在方法中要有多组返回值时,可以这么用:
class Search{
func getCompanyName(stockCode:String) -> (stockcode:String, companyName:String, price:Double) {
var code = "NO", company = "NO", price = 0.0
switch stockCode {
case "GOOG":
code = "GOOG"
company = "Google Inc"
price = 90.75
case "FB":
code = "FB"
company = "Faccebook Inc"
price = 88.9
case "TWTR":
code = "TWTR"
company = "Twitter Inc"
default:
break
}
return (code, company, price)
}
}
let companySearch = Search()
companySearch.getCompanyName(stockCode: "GOOG")
let searchForCompany = companySearch.getCompanyName(stockCode: "GOOG")
searchForCompany.stockcode
可选类型简介
不得不说,可选类型是Swift的一大特色! 什么是可选类型?可选类型便是该变量或常量的值可以有,也可以nil
(没有值,空的)默认情况下我们定义变量和常量是没有使用可选类型的。所以你想把一个有默认值的变量设成nil
编译器时会报错的,把下面这段代码打到playground中去,看看有什么错误:
var hi:String = "Swift!"
hi = nil
error: nil cannot be assigned to type 'String'
当你在类中这样做也会报错:
class Messager{
let message1 = "Swift is great" //OK
let message2:String //编译错误
}
因为我们在此前说过,类中的每个属性都要有默认值,如果不想给默认值可以使用可选类型,把上面代码改一下:
class Messager{
let message1 = "Swift is great" //OK
let message2:String? = nil //OK
}
在变量的类型后面加个?
问号就把这个变量变成了可选类型,定义的格式如下:
let 可选: 类型?
可选解包
可选类型是需要解包的,举个例子:
func getProduct(name:Int) -> String?{
switch name {
case 1:
return "Iphone 7"
case 2:
return "MAC"
default:
break
}
return nil
}
let text = "The product is -"
let productName = getProduct(name: 2)
let message = text + productName //编译错误
可选类型和普通类型在Swif中是两种不同的类型,就像上面的例子String
和String?
就像Int
和Srting
一样,两个类型不能直接相加,要经过特殊处理。
一般来说有两方法来处理,第一种叫强制解包 使用强制解包之前一定要确保被解包的变量里面不是nil!否则当你使用Swift写APP不注意这一点,你的程序将会崩溃!对于上面代码,我们可以在变量后面加上!
来解包:
let text = "The product is -"
let productName = getProduct(name: 2)
var message = ""
if productName != nil{
message = text + productName!
}
print(message)
对于上面强制解包的方法,我更推荐使用一下这种方法可选绑定 我们使用可选绑定来判断变量内是否为nil,如果不是nil,将该变量解包赋值一个临时变量或常量内去。所以上面的程序还可以这么写:
let text = "The product is -"
let productName = getProduct(name: 2)
var message = ""
if let temporary = productName{
message = text + temporary
}
print(message)
这里我们不必在使用!
来解包,如果常量productName
是nil的话,if中的语句就不会执行。相较于强制解包,使用可选绑定可以使你的代码质量更高。
可选链
在解释可选连之前,我们来举个栗子。我们新建一个类叫Company,里面有stockCode和name两个可选类型的属性。我们使用findCompany
函数来搜索公司,搜索到公司后返回一个company。
class Company{
var stockCode:String?
var name:String?
}
func findCompany(number:Int) -> Company?{
if number == 1{
var appl = Company()
appl.name = "Apple Inc"
appl.stockCode = "AAPL"
return appl
}else if number == 2{
var goog = Company()
goog.name = "Google Inc"
goog.stockCode = "GOOG"
return goog
}
return nil
}
我们找到公司后把公司名输出来:
if let company = findCompany(number: 1){
if let name = company.name {
print("company's name is \(name)")
}
}
上面的代码并没有错,只不过能不能跟简单一点呢?此时我们便可以使用可选链 代码如下:
if let name = findCompany(number: 1)?.name {
print("company's name is \(name)")
}
两段代码的结果都是一样,只不过可选链简洁了许多。如果你想了解更多关于可选链的信息可以查看苹果官方文档。