#2极速学习Swift

本次内容:

  • 元组
  • 可选类型简介
  • 可选解包
  • 可选链

元组

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中是两种不同的类型,就像上面的例子StringString?就像IntSrting一样,两个类型不能直接相加,要经过特殊处理。
一般来说有两方法来处理,第一种叫强制解包 使用强制解包之前一定要确保被解包的变量里面不是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)")
}

两段代码的结果都是一样,只不过可选链简洁了许多。如果你想了解更多关于可选链的信息可以查看苹果官方文档。


这些资料大部分都是我个人通过阅读官方文档,查阅资料所整理出来最精华的部分,如果你喜欢的话,可以关注我的专题

你可能感兴趣的:(#2极速学习Swift)