空運(yùn)算符(nil coalescing operator)(??)
------簡(jiǎn)單的說就是a有值取a滨巴,沒有值取默認(rèn)值b
空運(yùn)算符(a??b)將可選型a進(jìn)行空判斷悠夯,如果a包含一個(gè)值就進(jìn)行解封夕吻,否則就返回一個(gè)默認(rèn)值b粘优。這個(gè)運(yùn)算符號(hào)有兩個(gè)條件:
表達(dá)式a必須時(shí)optional類型
-
默認(rèn)值b的類型必須要和a存儲(chǔ)的類型要保持一致
空運(yùn)算符是對(duì)以下代碼的簡(jiǎn)短表達(dá)方法a != nil ? a! : b
意思是當(dāng)a不為空的時(shí)候玖绿,取a!強(qiáng)制對(duì)a進(jìn)行解封颜懊,當(dāng)a為空的時(shí)候,取值b
區(qū)間運(yùn)算符
------就是從a到b這個(gè)閉區(qū)間(包括a和b)上所有值
閉區(qū)間運(yùn)算符(a...b)定義了一個(gè)從a到b(包括a和b的所有值的區(qū)間)风皿,b必須大于a河爹。
var index:Int
for index in 1...5{
println("\(index)*5 = \(index*5)")
}
/**
1*5 = 5
2*5 = 10
3*5 = 15
4*5 = 20
5*5 = 25
**/
半開區(qū)間運(yùn)算符號(hào)
半開區(qū)間運(yùn)算符號(hào)(a..<b)定義的是從a到b但是不包括b的區(qū)間,只包含首值桐款,不包含末尾的值
let names = ["Anna","Alex","Brian","Jack"]
let count = names.count
for i in 0..<count {
println("第\(i+1)個(gè)人叫\(zhòng)(names[i])")
}
//
第1個(gè)人叫Anna
第2個(gè)人叫Alex
第3個(gè)人叫Brian
第4個(gè)人叫Jack
數(shù)組是從0開始計(jì)數(shù)的昌抠,用半?yún)^(qū)間的話,數(shù)組.count的時(shí)候去的是數(shù)組的長度鲁僚,但是循環(huán)是從0開始的炊苫,用閉區(qū)間的話,就會(huì)從0到4冰沙,是五個(gè)數(shù)侨艾,但是用半?yún)^(qū)間的話就是從0到3,正好是4個(gè)數(shù)對(duì)應(yīng)數(shù)組的長度拓挥。
protocol
暫時(shí)我的感覺protocol在swift中的作用相當(dāng)于java中的接口唠梨,規(guī)定了有哪些屬性和方法,但是不說必要的實(shí)現(xiàn)
下面是一條樣例:
我們規(guī)定了一個(gè)協(xié)議Fullname侥啤,這個(gè)協(xié)議中有一個(gè)可讀的屬性fullname当叭,我們的starship遵守Fullname協(xié)議,所以他必須要有fullname屬性盖灸,下面實(shí)例化Starship時(shí)候蚁鳖,傳入name和prefix。
先實(shí)例化赁炎,實(shí)例化的時(shí)候運(yùn)行了初始化的函數(shù)醉箕,賦值了name和prefix屬性。fullname根據(jù)我們賦值的name和prefix來定。n123的fullname為“ yaqi”讥裤,n1234的fullname為“jiang yaqi”
protocol FullName {
var fullname:String { get }
}//表示該屬性是可讀的
class Starship:FullName {
var prefix:String?
var name:String
init(name:String,prefix:String? = nil){
self.name = name
self.prefix = prefix
}
var fullname:String{
return (prefix != nil ? prefix! + " " : " ")+name
}//如果prefix不為空那個(gè)fullname取值“prefix空格+name”放棒,如果prefix沒有值取值“空格+name”
}
var n123 = Starship(name:"yaqi")
n123.fullname
var n1234 = Starship(name:"yaqi",prefix:"jiang")
n1234.fullname
下面是一個(gè)遵守協(xié)議的類的例子:
protocol RandomNumberGenerator{
func random() ->Double
}//協(xié)議規(guī)定了方法,當(dāng)類要遵守協(xié)議的時(shí)候就要包涵該方法己英。只是規(guī)定了方法的方法名字间螟,還有返回的數(shù)據(jù)類型,具體實(shí)現(xiàn)损肛,沒有規(guī)定
class LinerCongruentialGenerator:RandomNumberGenerator {
var lastRandom = 42.0
let m = 139968.0
let a = 3877.0
let c = 29573.0
func random() ->Double{
lastRandom = ((lastRandom * a + c)%m)
return lastRandom / m
}
}//該實(shí)現(xiàn)類遵守了該協(xié)議寒亥,包含了協(xié)議中規(guī)定的方法。
let generator = LinerCongruentialGenerator()//實(shí)例化一個(gè)實(shí)現(xiàn)類
print("Here's a random number:\(generator.random())")//調(diào)用類中的函數(shù)random()
print("And another one:\(generator.random())")