Swift`s tips

寫在前面

接觸swift也有段時間了,通過這段時間自己接觸和借鑒別人的經(jīng)驗(yàn)眠饮,記錄幾點(diǎn)關(guān)于swift的小技巧硫椰,雖然不是什么高深的原理知識,但是在平常的項(xiàng)目中用到或許可以提高開發(fā)效率呢
??馁菜,哈哈茴扁,接下來就簡單總結(jié)一下:

枚舉(ENUM)

結(jié)合一個小場景, 比如我們要做一個關(guān)于性別判斷的一個小case:
可能我們首先想到的就是這樣汪疮,硬編碼寫入峭火,每次都需要手動輸入

var gender = ""
gender = "man"
switch gender {
case "man":
    print("man")
    case "female":
    print("female")
default:
    print("other")
}

但是如果我們利用枚舉來寫的話:

enum Gender {
    case man
    case female
    case other
}
var gType: Gender = .man
switch gType {
case .man:
    print("男性")
case .female:
    print("女性")
case .other:
    print("其他類型")
default:
    print("我也不知道")
}

把需要的類型寫到enum 中毁习,就會減少不小心輸入錯誤的幾率,而且不在enum范圍中的實(shí)例卖丸,編輯器也會指出纺且。

空合運(yùn)算符

比如我們要定義某個label的默認(rèn)text, 也就是說稍浆,如果我們沒有去人為設(shè)置载碌,這個label就會用默認(rèn)text顯示,我們可能會這么寫:

var customText: String?
var defaultText = "您好"
var textToUse = ""
if let text = customText {
    textToUse = text
} else {
    textToUse = defaultText
}

如果換種簡單的寫法就成了這樣:

var customText: String?
var defaultText = "您好"
var textToUse = ""
var textToUse = customText ?? defaultText

?? 的意思就是如果textToUsenil則選擇defaultText 否則選擇customText

函數(shù)式

比如我們獲取10以內(nèi)的奇數(shù)衅枫, 第一想法是嫁艇,用for循環(huán)呀:

var arr = [Int]()
for i in 1...10 {
    if i % 2 == 1 {
        arr.append(i)
    }
}
print(arr)

當(dāng)然了,必然可以計(jì)算出結(jié)果弦撩,如果換種思路呢步咪,swift內(nèi)置filter函數(shù):

var arr = (1...10).filter { (num) -> Bool in
    num % 2 == 1
}
print(arr)
閉包 \ 函數(shù)

舉個栗子,兩個字符串拼接

使用函數(shù):

func sum(a: String, b: String) -> String {
    return a + b
}
var result = sum(a: "你好", b:"哈哈哈")

如果使用閉包的話:

var sumStringClosure: (String, String) -> String = {
    $0 + $1
}
sumStringClosure("hello", "world")

有木有感覺easy了好多

convenience init 便利初始化

我們聲明一個類益楼,給這個類設(shè)置變量然后將其初始化

class Animal {
    var dog: Int?
    var cat: Int?
    init(dog: Int, cat: Int) {
        self.dog = dog
        self.cat = dog
    }
}
var daDi = Animal(dag: 2, cat: 4)
daDi.dog
daDi.cat

假如我們想在每次用到 Animal這個類的時候猾漫,我們想著給這個類中的dog和cat都設(shè)置好數(shù)量,我們就可以用convenience init來設(shè)置

class Animal {
    var dog: Int?
    var cat: Int?
    init(dog: Int, cat: Int) {
        self.dog = dog
        self.cat = dog
    }
    convenience init() {
        self.init(dog: 10, cat: 10)
    }
}

var daDi = Animal()
daDi.dog
daDi.cat
屬性觀察

自從swift更新到swift3之后 我們發(fā)現(xiàn) 變量的set\get方法發(fā)生改變了有木有感凤,添加了一個很方便的屬性就是willSetdidSet悯周,比如我們?nèi)绻笠粋€正方形的周長,使用function的話是這樣子的 :

var length :Double?
func getDiameter(length: Double) -> Double {
    return length * 4
}
getDiameter(length: 10)

如果我們使用變量的屬性觀察方法:

var perimeter: Double?
var length: Double? {
willSet {
    print("準(zhǔn)備賦值中")
}
didSet {
    perimeter = length! * 4
}
}
length = 20
perimeter

willSet
是在屬性發(fā)生改變之前調(diào)用的
didSet
是在屬性發(fā)生改變之后調(diào)用的陪竿。

遍歷方法

打印字符串:如果使用while 來

var i = 0
while i < 5 {
    print("irembeu")
    i += 1
}

我們必須要定義一個變量來確保打印達(dá)到我們要求的次數(shù)禽翼,但是我們定義越多的變量就意味著出錯的風(fēng)險越大,所以還是盡量少寫點(diǎn)兒代碼萨惑,改成for循環(huán)版:

for _ in 1...10 {
    print("itembeu")
}

不需要我們定義多余變量捐康,因?yàn)閟wift語法設(shè)計(jì)的時候用_來代替可以忽略的變量了

計(jì)算屬性\ 函數(shù)

取圓的直徑和半徑:
1、使用函數(shù):在這種情況下庸蔼,我們根據(jù)半徑求直徑解总,根據(jù)已經(jīng)直徑求半徑,需要寫兩個function

func getDiameter(radius: Double) -> Double { return radius * 2}
func getRadius(diameter: Double) -> Double { return diameter / 2}
getDiameter(radius: 20)
getRadius(diameter: 100)

2姐仅、使用變量的計(jì)算屬性

var radius: Double = 10
var diameter: Double {
    get {
        return radius * 2
        }
    set {
        radius = newValue / 2
        }
}
radius // 20
diameter // 40
diameter = 600
radius // 300

我們知道直徑和半徑是相互依存的關(guān)系的花枫,使用變量的計(jì)算屬性這樣看起來要比使用函數(shù)計(jì)算要簡潔的多了。

泛型

如果我們需要將不同類型數(shù)組中的變量打印輸出掏膏,我們可能會這樣做:

var stringArr = ["騎士", "湖人", "公牛"]
var intArr = [1, 3, 4, 5, 6]
var doubleArr = [1.0, 2.0, 3.0]
func printStringArr(a: [String]) { for s in a { print(s) } }
func printIntArr(a: [Int]) { for i in a { print(i) } }
func printDoubleArr(a: [Double]) {for d in a { print(d) } }

我們需要定義不同類型的數(shù)組劳翰,如果類型多了,那我們做的無謂的工作就有點(diǎn)兒多了馒疹,這時候我們?nèi)绻褂梅盒蛠斫鉀Q這個問題的話:

func printElementFromArr<T>(elements: [T]) {
    for e in elements {
        print(e)
    }
}
printElementFromArr(elements: [1,2,3,4])

簡單好多 有木有佳簸, 泛型是Swift語言強(qiáng)大的核心,泛型是對類型的抽象,使用泛型開發(fā)者可以更加靈活方便的表達(dá)代碼意圖生均。有參函數(shù)的參數(shù)必須有一個明確的參數(shù)類型听想,有些時候開發(fā)者會遇到這樣一種情況,就像上面我們舉的這個例子马胧,由于變量有類型之分汉买,實(shí)現(xiàn)相同的功能,可能需要重載成多個函數(shù)來實(shí)現(xiàn)佩脊,這大大浪費(fèi)了開發(fā)成本蛙粘,使用泛型,可以完美的解決這個問題威彰。

拓展

swift 中沒有了OC中的category 但是保留了extension出牧, 我們和extension打交道的時候也就比較多了, 如果我們需要計(jì)算一個數(shù)的平方抱冷,我們可以聲明一個函數(shù)崔列, 像這樣:

func squ(x: Int) -> Int {
    return x * x
}
var s = squ(x: 10)

那如果我們要求10 的4次方的話,我們就要var s = squ(x: 10) squ(x: s)創(chuàng)建多余變量旺遮。
使用拓展:

extension Int {
    var squ: Int {
        return self * self
    }
}
10.squ
10.squ.squ

簡潔,不需要多創(chuàng)建變量盈咳。

Gaurd let \ if let

檢驗(yàn)用戶名和密碼:
1耿眉、使用if let, 我們需要一層層的嵌套

var uName: Double?
var uPassword: Double?
func userLogIn() {
    if let username = uName {
        if let password = uPassword {
            print("歡迎, \(username)"!)
        }
    }
}

2鱼响、使用gaurd let鸣剪, 如果uName或者uPassword為nil的話,程序就會走return方法丈积,提前結(jié)束運(yùn)行筐骇, 否則就會print("歡迎, \(username)!")

var uName: Double?
var uPassword: Double?
func userLogIn() {
     guard let username = uName, let password = uPassword 
          else { return } 
        print("歡迎, \(username)!") 
}

。江滨。铛纬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唬滑,隨后出現(xiàn)的幾起案子告唆,更是在濱河造成了極大的恐慌,老刑警劉巖晶密,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擒悬,死亡現(xiàn)場離奇詭異,居然都是意外死亡稻艰,警方通過查閱死者的電腦和手機(jī)懂牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尊勿,“玉大人僧凤,你說我怎么就攤上這事畜侦。” “怎么了拼弃?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵夏伊,是天一觀的道長。 經(jīng)常有香客問我吻氧,道長溺忧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任盯孙,我火速辦了婚禮鲁森,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘振惰。我一直安慰自己歌溉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布骑晶。 她就那樣靜靜地躺著痛垛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桶蛔。 梳的紋絲不亂的頭發(fā)上匙头,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音仔雷,去河邊找鬼蹂析。 笑死,一個胖子當(dāng)著我的面吹牛碟婆,可吹牛的內(nèi)容都是我干的电抚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼竖共,長吁一口氣:“原來是場噩夢啊……” “哼蝙叛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肘迎,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤甥温,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后妓布,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姻蚓,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年匣沼,在試婚紗的時候發(fā)現(xiàn)自己被綠了狰挡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖加叁,靈堂內(nèi)的尸體忽然破棺而出倦沧,到底是詐尸還是另有隱情,我是刑警寧澤它匕,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布展融,位于F島的核電站,受9級特大地震影響豫柬,放射性物質(zhì)發(fā)生泄漏告希。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一烧给、第九天 我趴在偏房一處隱蔽的房頂上張望燕偶。 院中可真熱鬧,春花似錦础嫡、人聲如沸指么。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伯诬。三九已至,卻和暖如春巫财,著一層夾襖步出監(jiān)牢的瞬間姑廉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工翁涤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萌踱。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓葵礼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親并鸵。 傳聞我的和親對象是個殘疾皇子鸳粉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容