亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

分享十條實(shí)用的Swift小提示

 更新時(shí)間:2018年06月22日 09:03:07   作者:游星啊  
是時(shí)候使用易入手又全面的Swif語(yǔ)言為iOS和mac OS X做應(yīng)用開發(fā)了,下面這篇文章主要給大家分享介紹了十條實(shí)用的Swift小提示的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧

前言

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

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

1.類與協(xié)議的existential

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

func process(user: User) { }

之后我們寫一個(gè)函數(shù),讓它能接收符合某個(gè)協(xié)議的任意類型對(duì)象:

func identify(thing: Identifiable) { }

Swift允許我們讓existential同時(shí)代表類與協(xié)議

下例中,有一個(gè)協(xié)議和一個(gè)符合該協(xié)議的類

protocol CanCook { }
class CelebrityChef: CanCook { }

之后再有一個(gè)類,并附有一個(gè)子類

class Appliance { }
class Hairdryer: Appliance { }

現(xiàn)在我們有了一個(gè)定義東西是否CanCook的協(xié)議,和一個(gè)定義我們家里東西的類。當(dāng)我們把這兩個(gè)合二為一時(shí)候就變得復(fù)雜了——用餐飲工具(Appliance)做飯。

定義它們很簡(jiǎn)單,因?yàn)樗鼈兛梢詺w入Appliance的子類,并符合CanCook

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

Swift的existential可以支持使用它們。但除非你是認(rèn)識(shí)某個(gè)大廚,不然你應(yīng)該找不到一個(gè)大廚來(lái)你家做飯。類似的,除非你實(shí)在沒辦法,你也不會(huì)用一個(gè)吹風(fēng)機(jī)做飯。

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

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

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

func makeDinner(using: Appliance & CanCook) { }

2.協(xié)議擴(kuò)展可以提供默認(rèn)屬性值

協(xié)議擴(kuò)展為方法的執(zhí)行提供了默認(rèn)屬性值,這些默認(rèn)值之后可以被符合類型覆蓋,但你也可以用它們?yōu)閷傩蕴峁┠J(rèn)值。

下例中我們創(chuàng)建一個(gè)Fadeable協(xié)議,并在設(shè)定好的秒數(shù)后逐漸淡出:

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

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

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

這樣你可以讓新的子類符合它們,而不用擔(dān)心重復(fù)寫相同的默認(rèn)值

class MyViewClass: UIView, Fadeable { }

3.檢查所有的集合項(xiàng)目是否滿足一個(gè)狀態(tài)

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

例如某人考試結(jié)果數(shù)組如下:

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

根據(jù)一個(gè)學(xué)生是否所有考試都達(dá)到85分,決定他是否通過(guò)。

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

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

解構(gòu)能夠把元祖分解成獨(dú)立數(shù)值,這樣就可以更容易的操作它們。比如你也許想調(diào)用這樣一個(gè)函數(shù):

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

它會(huì)返回一個(gè)包含兩個(gè)字符串的元祖,如果你想讓他們繼續(xù)在一起,你可以:

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

然而,重構(gòu)讓我們能夠把它們分開:

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

你甚至可以在函數(shù)被調(diào)用完后做這些——它們是一樣的:

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

這個(gè)技術(shù)讓Swift能夠簡(jiǎn)單輕易地解決一個(gè)經(jīng)典入門代碼問題:怎樣在不使用第三個(gè)變量的情況下,交換兩個(gè)變量。

多虧重構(gòu),Swift才能有這種最簡(jiǎn)單的解決方式:

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

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

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

為了保證安全,如果超過(guò)整型的限值,Swift會(huì)自動(dòng)崩潰。比如下面的代碼在編譯時(shí)沒問題而運(yùn)行時(shí)會(huì)崩潰

let highScore = Int8.max
let newHighScore = highScore + 1

因?yàn)樗贗nt8.max上加1,產(chǎn)生了超過(guò)Int8存儲(chǔ)范圍的128。盡管崩潰聽起來(lái)不好,但是至少它保證了安全。

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

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

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

6.公眾只讀,個(gè)人可寫

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

例如下面的結(jié)構(gòu)代表一家銀行:

struct Bank {
 var address: String
}

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

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

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

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

Swift結(jié)構(gòu)默認(rèn)用成員逐一初始化,它可以方便快捷地創(chuàng)建實(shí)例

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

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

如果你想要你的初始化與成員逐一初始化同時(shí)使用,步驟很簡(jiǎn)單。把你的初始化聲明到一個(gè)擴(kuò)展中,像這樣:

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

8.static vs class屬性

Swift中的類屬性可以用2種關(guān)鍵詞創(chuàng)建:static 和 class。它們都能讓一個(gè)類中所有實(shí)例共享某個(gè)屬性,但static意味著final,即無(wú)法在子類中被覆蓋。

例如我們可以創(chuàng)建一個(gè)Building類,并定義一個(gè)用于存儲(chǔ)建筑規(guī)劃的class屬性,和一個(gè)用于存儲(chǔ)安全須知的static屬性。

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

因?yàn)閦oningRestrictions是class屬性,可以在子類中修改,比如居民區(qū)建住房,商業(yè)區(qū)建寫字樓等等。相對(duì)的safetyRequirements是一個(gè)static屬性,意味著所有房屋和子類必須符合安全法規(guī)。

代碼如下:

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. == 和 === 是不一樣的

==運(yùn)算符用于檢測(cè)兩個(gè)Equatable類型是否相等,例如

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

通過(guò)對(duì)Equatable的自動(dòng)綜合分析,對(duì)==的支持就像對(duì)類型定義添加Equatable一樣簡(jiǎn)單。但如果是對(duì)類,有另一個(gè)運(yùn)算符:===。

因?yàn)轭愔械膶?shí)例只不過(guò)是對(duì)內(nèi)存特定地址的引用,===用于檢查一個(gè)類中的2個(gè)實(shí)例是否指向同一段內(nèi)存地址。

所以下面的情況會(huì)被認(rèn)為是true

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

===運(yùn)算符完全不使用Equatable,這就是說(shuō)如果你創(chuàng)建2個(gè)擁有相同屬性的獨(dú)立對(duì)象,===會(huì)返回false

let saber3 = Lightsaber()
saber1 === saber3

10.通過(guò)numericCast()在整型間轉(zhuǎn)換

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

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

它的常用地點(diǎn)之一是arc4random_uniform()函數(shù),這個(gè)函數(shù)會(huì)接收一個(gè)UInt32參數(shù)并返回一個(gè)UInt32,這里經(jīng)常要在Int與UInt32之間加類型轉(zhuǎn)換。

使用numericCast的話,你就可以寫出很好的任意范圍的實(shí)現(xiàn)

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

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

不是所有人都喜歡NOT運(yùn)算符,!,主要是因?yàn)樗x起來(lái)不自然。然而Swift中功能,方法,閉包,運(yùn)算符之間的界限變得模糊了。所以如果你想的話,可以把!轉(zhuǎn)化為它的函數(shù):

let not = (!)

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

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 詳解Swift的內(nèi)存管理

    詳解Swift的內(nèi)存管理

    這篇文章主要介紹了Swift的內(nèi)存管理,對(duì)內(nèi)存管理感興趣的同學(xué),可以參考下
    2021-04-04
  • 使用Swift實(shí)現(xiàn)iOScollectionView廣告無(wú)限滾動(dòng)效果(DEMO)

    使用Swift實(shí)現(xiàn)iOScollectionView廣告無(wú)限滾動(dòng)效果(DEMO)

    本文給大家分享使用Swift實(shí)現(xiàn)iOScollectionView廣告無(wú)限滾動(dòng)效果(DEMO),非常不錯(cuò),具有一定的參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-11-11
  • 深入講解Swift中的模式匹配

    深入講解Swift中的模式匹配

    在Swift中,一些模式已經(jīng)被語(yǔ)言特性所吸收,你在使用Swift甚至察覺不出這類問題的存在,下面這篇文章主要給大家介紹了關(guān)于Swift中模式匹配的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-08-08
  • Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目

    Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)簡(jiǎn)單計(jì)算器項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift與C語(yǔ)言指針結(jié)合使用實(shí)例

    Swift與C語(yǔ)言指針結(jié)合使用實(shí)例

    這篇文章主要介紹了Swift與C語(yǔ)言指針結(jié)合使用實(shí)例,本文講解了用以輸入/輸出的參數(shù)指針、作為數(shù)組使用的參數(shù)指針、用作字符串參數(shù)的指針、指針參數(shù)轉(zhuǎn)換的安全性等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • Swift3.0仿支付寶二維碼掃描效果

    Swift3.0仿支付寶二維碼掃描效果

    這篇文章主要為大家詳細(xì)介紹了Swift3.0仿支付寶二維碼掃描效果的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Swift方法調(diào)度之類的普通方法底層探究

    Swift方法調(diào)度之類的普通方法底層探究

    這篇文章主要介紹了Swift-方法調(diào)度-類的普通方法底層探究,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Swift中循環(huán)語(yǔ)句中的轉(zhuǎn)移語(yǔ)句 break 和 continue

    Swift中循環(huán)語(yǔ)句中的轉(zhuǎn)移語(yǔ)句 break 和 continue

    這篇文章主要介紹了Swift中循環(huán)語(yǔ)句中的轉(zhuǎn)移語(yǔ)句 break 和 continue,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的的朋友參考下
    2016-12-12
  • 在?Swift?中編寫Git?Hooks腳本的方法

    在?Swift?中編寫Git?Hooks腳本的方法

    在本例中,我使用了?commit-msg?鉤子,它能夠在當(dāng)前提交信息生效前修改此信息,鉤子由一個(gè)參數(shù)調(diào)用,該參數(shù)是指向包含用戶輸入的提交消息的文件的路徑,這意味著,為了改變提交消息,我們只需要從文件中讀取、修改其內(nèi)容,然后寫回調(diào)用掛鉤的文件
    2022-06-06
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包

    Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包

    Swift引進(jìn)了閉包的概念,這個(gè)與object-c的block類似,使用過(guò)block的話都知道有多方便,所以開始學(xué)Swift,先要把閉包學(xué)會(huì),后面使用會(huì)很頻繁。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之閉包的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03

最新評(píng)論