亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

分享十條實用的Swift小提示

2020-03-09 17:31:42
字體:
來源:轉載
供稿:網友

前言

雖然編程語言不會那么容易消逝,但堅持衰落范例的開發小組正在這么做。如果你正為移動設備開發應用程序,并且你還沒有研究Swift,那么注意:當Swift涉及到Mac、iPhone、ipad、Apple Watch和未來設備的應用開發時,它不僅會排擠掉Objective-C,而且還會取代在Apple平臺中做嵌入式開發的C語言。 Swift有大量有趣的語法、特性、特點,只要掌握了用法就可以利用好它們。

在這篇文章中我會帶你瀏覽我選擇出的10條小提示,并附有已驗證的代碼供大家試用。

1.類與協議的existential

Existential類型允許我們說出想要一個類型具有哪種功能,而不用請求某些特定的東西。比如我們可以寫一個接收類或子類的函數:

func process(user: User) { }

之后我們寫一個函數,讓它能接收符合某個協議的任意類型對象:

func identify(thing: Identifiable) { }

Swift允許我們讓existential同時代表類與協議

下例中,有一個協議和一個符合該協議的類

protocol CanCook { }class CelebrityChef: CanCook { }

之后再有一個類,并附有一個子類

class Appliance { }class Hairdryer: Appliance { }

現在我們有了一個定義東西是否CanCook的協議,和一個定義我們家里東西的類。當我們把這兩個合二為一時候就變得復雜了——用餐飲工具(Appliance)做飯。

定義它們很簡單,因為它們可以歸入Appliance的子類,并符合CanCook

class Oven: Appliance, CanCook { }class Microwave: Appliance, CanCook { }

Swift的existential可以支持使用它們。但除非你是認識某個大廚,不然你應該找不到一個大廚來你家做飯。類似的,除非你實在沒辦法,你也不會用一個吹風機做飯。

結果就是,這兩個函數都不夠好用——它們并沒有完整描繪出我們想要接收的文件類型:

func makeDinner(using: Appliance) { }func makeDinner(using: CanCook) { }

好在通過寫Appliance & CanCook,Swift讓我們能夠把協議與子類合并到一個existential中。我們希望某些東西是日常工具(Appliance),并符合CanCook協議,就像這樣:

func makeDinner(using: Appliance & CanCook) { }

2.協議擴展可以提供默認屬性值

協議擴展為方法的執行提供了默認屬性值,這些默認值之后可以被符合類型覆蓋,但你也可以用它們為屬性提供默認值。

下例中我們創建一個Fadeable協議,并在設定好的秒數后逐漸淡出:

protocol Fadeable { var fadeSpeed: TimeInterval { get } func fadeOut()}

比起給所有符合類型添加各自的淡出速度和fadeOut()方法,我們可以在一個協議擴展中為它們提供默認值。

extension Fadeable where Self: UIView { var fadeSpeed: TimeInterval { return 1.0 }  func fadeOut() { UIView.animate(withDuration: fadeSpeed) {  self.alpha = 0 } }}

這樣你可以讓新的子類符合它們,而不用擔心重復寫相同的默認值

class MyViewClass: UIView, Fadeable { }

3.檢查所有的集合項目是否滿足一個狀態

Swift 4.2新推出了allSatisfy()方法,讓它運行一個狀態閉包(condition closure),如果傳遞給這個閉包后,所有元素都返回true,那么allSatisfy()就返回true

例如某人考試結果數組如下:

let scores = [85, 88, 95, 92]

根據一個學生是否所有考試都達到85分,決定他是否通過。

let passed = scores.allSatisfy { $0 >= 85 }

4.使用解構(destructuring)操作元祖(tuples)

解構能夠把元祖分解成獨立數值,這樣就可以更容易的操作它們。比如你也許想調用這樣一個函數:

func getCredentials() -> (name: String, password: String) { return ("Taylor Swift", "biebersux")}

它會返回一個包含兩個字符串的元祖,如果你想讓他們繼續在一起,你可以:

let user = getCredentials()print(user.name)print(user.password)

然而,重構讓我們能夠把它們分開:

let (username, password) = getCredentials()print(username)print(password)

你甚至可以在函數被調用完后做這些——它們是一樣的:

let user = getCredentials()let (username, password) = user

這個技術讓Swift能夠簡單輕易地解決一個經典入門代碼問題:怎樣在不使用第三個變量的情況下,交換兩個變量。

多虧重構,Swift才能有這種最簡單的解決方式:

var a = 10var b = 20(a, b) = (b, a)

5.通過溢出(overflow)算符讓加減法能夠環繞處理

所有的Swift整型都有最大值,比如UInt8的最大值是255,Int64的最大值是9,223,372,036,854,775,807。

為了保證安全,如果超過整型的限值,Swift會自動崩潰。比如下面的代碼在編譯時沒問題而運行時會崩潰

let highScore = Int8.maxlet newHighScore = highScore + 1

因為它在Int8.max上加1,產生了超過Int8存儲范圍的128。盡管崩潰聽起來不好,但是至少它保證了安全。

不過,Swift提供了另一種處理方法:我們可以用overflow做加法,它讓Swift繞回最小值,而不是崩潰。

let highNumber = UInt8.maxlet nextNumber = highNumber &+ 1

它實際上挺常用,例如MySQL數據庫會自動分配整數ID到數據庫表單的行中。但是當整數都用完后,它會繞回并從1開始查到未使用ID,其中有些會隨時間被刪除。

6.公眾只讀,個人可寫

盡管Swift的訪問控制過去倍受詬病,但通過使用2個不同的訪問控制屬性可以改善很多。

例如下面的結構代表一家銀行:

struct Bank { var address: String}

我們對address沒有使用任何訪問控制,意味著任何人都可以讀取并改寫它。如果我們對這個屬性用private,別人是改不了它,但也無法讀它了。

Swift做出了一個兼顧:public private(set) 它可以讓一個屬性可被讀取,但不能被寫入。這樣所有人都可以讀取我們銀行的地址,但只有銀行才能改它。

struct Bank { public private(set) var address: String}

7.成員逐一初始化(memberwise initializers)與自定初始化協同

Swift結構默認用成員逐一初始化,它可以方便快捷地創建實例

struct Score { var player: String var score: Int} let highScore = Score(player: "twostraws", score: 556)

但是如果你創建自己的初始化,你會自動失去成員逐一初始化。這是考慮到安全問題:你的初始化似乎是做了一些你覺得很重要的額外工作,所以如果Swift還用成員逐一初始化,那你的額外工作會被跳過。

如果你想要你的初始化與成員逐一初始化同時使用,步驟很簡單。把你的初始化聲明到一個擴展中,像這樣:

struct Score { var player: String var score: Int} extension Score { init(player: String) {  self.player = player  score = 0 }} // 現在它們都可用了let highScore1 = Score(player: "twostraws", score: 0)let highScore2 = Score(player: "twostraws")

8.static vs class屬性

Swift中的類屬性可以用2種關鍵詞創建:static 和 class。它們都能讓一個類中所有實例共享某個屬性,但static意味著final,即無法在子類中被覆蓋。

例如我們可以創建一個Building類,并定義一個用于存儲建筑規劃的class屬性,和一個用于存儲安全須知的static屬性。

class Building { class var zoningRestrictions: String {  return "None" }  static var safetyRequirements: [String] {  return ["Fire escapes", "Sprinklers"] }}

因為zoningRestrictions是class屬性,可以在子類中修改,比如居民區建住房,商業區建寫字樓等等。相對的safetyRequirements是一個static屬性,意味著所有房屋和子類必須符合安全法規。

代碼如下:

class Skyscraper: Building { // this is allowed override class var zoningRestrictions: String {  return "Dense commercial only" }  // but this is not override static var safetyRequirements: [String] {  return ["Sprinklers"] }}

9. == 和 === 是不一樣的

==運算符用于檢測兩個Equatable類型是否相等,例如

1 == 1"kayak" == String("kayak".reversed())[2, 4, 6] == [1, 2, 3].map { $0 * 2 }

通過對Equatable的自動綜合分析,對==的支持就像對類型定義添加Equatable一樣簡單。但如果是對類,有另一個運算符:===。

因為類中的實例只不過是對內存特定地址的引用,===用于檢查一個類中的2個實例是否指向同一段內存地址。

所以下面的情況會被認為是true

class Lightsaber { var color = "Blue"} let saber1 = Lightsaber()let saber2 = saber1saber1 === saber2

===運算符完全不使用Equatable,這就是說如果你創建2個擁有相同屬性的獨立對象,===會返回false

let saber3 = Lightsaber()saber1 === saber3

10.通過numericCast()在整型間轉換

在使用整數方面,Swift一直有高度選擇性,如果你不留意,經常會發現你的代碼中分散著Int(), UInt32(),和其他類型轉換。也許這段代碼不會出錯,但它并不易于閱讀:這就是為什么我們需要強制制定一種整型。

Swift有個專用的整型轉換函數numericCast() 用了它就可以做到“我不關心這里需要什么類型,請查明白”。這樣比起硬編碼的類型,它可以更清楚的傳達你的意圖:為了運行的更好,你需要把一種整型轉換到另外一種,但并不關心到底是怎么轉換的

它的常用地點之一是arc4random_uniform()函數,這個函數會接收一個UInt32參數并返回一個UInt32,這里經常要在Int與UInt32之間加類型轉換。

使用numericCast的話,你就可以寫出很好的任意范圍的實現

func random(in range: Range<int>) -> Int { return numericCast(arc4random_uniform(numericCast(range.count)))  + range.lowerBound}</int>

額外小技巧:如果不用 ! 那用什么

不是所有人都喜歡NOT運算符,!,主要是因為它讀起來不自然。然而Swift中功能,方法,閉包,運算符之間的界限變得模糊了。所以如果你想的話,可以把!轉化為它的函數:

let not = (!)

現在你可以用not(someBool)代替!someBool

let loggedIn = false if not(loggedIn) { print("Please log in.")}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人在线免费观看视视频| 狠狠躁夜夜躁人人躁婷婷91| 韩国v欧美v日本v亚洲| 日韩在线视频观看正片免费网站| 91av视频在线| 亚洲女性裸体视频| 亚洲精品国产精品乱码不99按摩| 久久999免费视频| 久久精品国产欧美亚洲人人爽| 亚州欧美日韩中文视频| 国产精品美女无圣光视频| 国产精品美女免费视频| 日本不卡高字幕在线2019| 国语自产精品视频在免费| 日韩在线激情视频| 亚洲精品国产综合久久| 尤物yw午夜国产精品视频明星| 亚洲国内精品在线| 91美女高潮出水| 欧美xxxx做受欧美| 欧美国产日本高清在线| 亚洲第一精品自拍| 永久免费精品影视网站| 日韩视频在线免费| 中文字幕精品在线| 欧美日韩免费观看中文| 欧美成人精品三级在线观看| 456国产精品| 91美女片黄在线观看游戏| 成人美女av在线直播| 日韩在线观看免费高清| 国产91精品久久久久| 九九热在线精品视频| 一本一本久久a久久精品牛牛影视| 亚洲自拍欧美色图| 久久国内精品一国内精品| 日韩在线免费视频观看| 亚洲级视频在线观看免费1级| 久久久久久成人精品| 久久精品国产v日韩v亚洲| 欧美激情视频一区| 国产午夜精品久久久| 91国自产精品中文字幕亚洲| 狠狠久久亚洲欧美专区| 欧美高跟鞋交xxxxhd| 欧美成人午夜激情在线| 欧美国产精品人人做人人爱| 欧美一级淫片aaaaaaa视频| 最近2019中文免费高清视频观看www99| 亚洲免费小视频| 亚洲激情在线观看视频免费| 中文字幕日韩在线视频| 国产午夜精品一区二区三区| 久久久视频精品| 丝袜情趣国产精品| 久久国产精品网站| 欧美亚洲另类激情另类| 国产亚洲欧美日韩美女| 日韩精品久久久久久久玫瑰园| 亚洲男人天堂2024| 色悠悠久久久久| 98精品在线视频| 久久精品国产欧美激情| 中文字幕亚洲一区在线观看| 亚洲欧美激情精品一区二区| 成人黄色短视频在线观看| 欧美激情一级二级| 亚洲一区精品电影| 欧美精品一本久久男人的天堂| 国产成人一区二区在线| 欧美一级在线播放| 成人免费直播live| 久久国产精品久久久久| 久久久999精品视频| 精品色蜜蜜精品视频在线观看| 国产日韩专区在线| 不卡av电影在线观看| 亚洲男人天堂视频| 2019中文字幕在线| 午夜精品久久久久久久99热| 亚洲第一精品福利| 国产精品视频xxxx| 成人午夜在线观看| 亚洲精品少妇网址| 琪琪亚洲精品午夜在线| 欧美大片大片在线播放| 亚洲精品久久久久中文字幕欢迎你| 97在线日本国产| 国产成人精品综合久久久| 欧美日韩国产精品专区| 亚洲伊人一本大道中文字幕| 欧美黑人性生活视频| 欧美高清理论片| 蜜月aⅴ免费一区二区三区| 91免费高清视频| 国精产品一区一区三区有限在线| 欧美综合在线观看| 一区二区三区 在线观看视| 最近2019中文字幕mv免费看| 国外视频精品毛片| 日韩风俗一区 二区| 欧美专区日韩视频| 欧美影院在线播放| 国产精品国语对白| 久久99精品久久久久久噜噜| 久久精品久久久久久| 中文字幕久久亚洲| 日韩国产高清视频在线| 色www亚洲国产张柏芝| 91成人免费观看网站| 国产精品一区久久| 欧美亚洲激情在线| 久久99精品久久久久久琪琪| 成人a在线观看| 成人a在线视频| 国产精品久久综合av爱欲tv| 97香蕉久久超级碰碰高清版| 久久精品国产亚洲精品2020| 欧美极品第一页| 国产亚洲精品久久久久久| 亚洲天堂av综合网| 欧美午夜激情小视频| 亚洲一区av在线播放| 日韩视频免费中文字幕| 成人激情视频网| 精品欧美aⅴ在线网站| 亚洲第一免费网站| 欧美视频在线视频| 国产精品扒开腿做爽爽爽男男| 北条麻妃在线一区二区| 欧美激情视频在线免费观看 欧美视频免费一| 欧美成人激情视频| 亚洲精品久久久久久久久久久| 亚洲精品国产精品乱码不99按摩| 日韩电影在线观看中文字幕| 亚洲欧美日韩久久久久久| 精品magnet| 九九热99久久久国产盗摄| 国产精品入口尤物| 欧美高跟鞋交xxxxxhd| 亚洲奶大毛多的老太婆| 91伊人影院在线播放| 亚洲精品美女久久| 亚洲午夜精品视频| 不卡av在线播放| 国产精品aaa| 精品久久久久久久大神国产| 亚洲欧美日韩高清| 深夜福利一区二区| 国产精品高潮呻吟久久av无限| 欧美一级电影免费在线观看| 九九热精品视频在线播放| 黑人巨大精品欧美一区二区一视频| 国产精品丝袜高跟| 夜夜嗨av色一区二区不卡| 久久久av亚洲男天堂| 国产精品偷伦视频免费观看国产| 欧美激情a∨在线视频播放| 欧美肥臀大乳一区二区免费视频| 成人黄色av网| 亚洲va电影大全| 国产精品中文字幕在线| 少妇高潮 亚洲精品| 美日韩精品视频免费看|