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

首頁 > 編程 > Swift > 正文

Swift 4最全的新特性詳細解析(推薦)

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

引言

Swift,蘋果于2014年WWDC(蘋果開發者大會)發布的新開發語言,可與Objective-C共同運行于Mac OS和iOS平臺,用于搭建基于蘋果平臺的應用程序。Swift吸收了眾多現代編程語言的優點,盡力的提供簡潔的編程語言和強大的功能。

WWDC 2017 給大家帶來了很多驚喜。Swift 4 也伴隨著 Xcode 9 測試版來到了我們的面前,很多強大的新特性非常值得我們期待在正式項目中去使用它。因為 Swift 4 是開源的,如果你關注 swift-evolution 這個項目的話,就應該已經提前了解到它的新特性了。本文參考了 WWDC 2017 以及各種資料,,從語法、字符串、標準庫、構建過程等方面,把 Swift 4 的這些新特性一一列舉出來做介紹和分析,讓他們毫無保留地展現在你眼前,下面話不多說了,來隨著小編一起看看詳細的介紹吧。

一、語法改進

extension 中可以訪問 private 的屬性

考慮以下代碼:

struct Date: Equatable, Comparable { private let secondsSinceReferenceDate: Double static func ==(lhs: Date, rhs: Date) -> Bool { return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate } static func <(lhs: Date, rhs: Date) -> Bool { return lhs.secondsSinceReferenceDate < rhs.secondsSinceReferenceDate }}

上面代碼定義了一個 Date 結構體,并實現 Equatable 和 Comparable 協議。為了讓代碼更清晰,可讀性更好,一般會把對協議的實現放在單獨的 extension 中,這也是一種非常符合 Swift 風格的寫法,如下:

struct Date { private let secondsSinceReferenceDate: Double}extension Date: Equatable { static func ==(lhs: Date, rhs: Date) -> Bool { return lhs.secondsSinceReferenceDate == rhs.secondsSinceReferenceDate }}extension Date: Comparable { static func <(lhs: Date, rhs: Date) -> Bool { return lhs.secondsSinceReferenceDate < rhs.secondsSinceReferenceDate }}

但是在 Swift 3 中,編譯就報錯了,因為 extension 中無法獲取到 secondsSinceReferenceDate 屬性,因為它是 private 的。于是在 Swift 3 中,必須把 private 改為 fileprivate。

struct Date { fileprivate let secondsSinceReferenceDate: Double}...

但是如果用 fileprivate,屬性的作用域就會比我們需要的更大,可能會不小心造成屬性的濫用。

在 Swift 4 中,private 的屬性的作用域擴大到了 extension 中,并且被限定在了 struct 和 extension 內部,這樣就不需要再改成 fileprivate 了,這是最好的結果。

類型和協議的組合類型

考慮以下代碼:

protocol Shakeable { func shake()}extension UIButton: Shakeable { /* ... */ }extension UISlider: Shakeable { /* ... */ }func shakeEm(controls: [???]) { for control in controls where control.state.isEnabled { } control.shake()}

在 Swift 3 中,這里的 ??? 應該寫什么呢?如果寫 UIControl,那么 control.shake() 就會報錯;如果寫 Shakeable,那么 control.state.isEnabled 就會報錯。其實我們也可以這樣寫:

func shakeEm(controls: [UIControl]) { for control in controls where control.isEnabled { if control is Shakeable {  (control as! Shakeable).shake() } }}

這樣寫雖然可以跑通了,但是很丑陋。

在 Swift 4 中,可以把類型和協議用 & 組合在一起作為一個類型使用,就可以像下面這樣寫了:

protocol Shakeable { func shake()}extension UIButton: Shakeable { /* ... */ }extension UISlider: Shakeable { /* ... */ }func shakeEm(controls: [UIControl & Shakeable]) { for control in controls where control.state.isEnabled { control.shake() }// Objective-C API@interface NSCandidateListTouchBarItem<CandidateType> : NSTouchBarItem@property (nullable, weak) NSView <NSTextInputClient> *client;@end}

把它聲明為了 UIControl & Shakeable 類型。OK,圓滿解決。

PS:

這個代碼例子是 WWDC 2017 的 PPT 中的,上面的代碼有點問題,control.state.isEnabled 這句代碼中,state 是沒有 isEnabled 這個屬性的,改為 control.isEnabled 就可以了??磥硖O果的工程師做 PPT 有時候還是不太嚴謹。

另外,iOS SDK 中的 API 也用這個特性做了優化,例如:

// Objective-C API@interface NSCandidateListTouchBarItem<CandidateType> : NSTouchBarItem@property (nullable, weak) NSView <NSTextInputClient> *client;@end

這個 API 的 Objective-C 版本是沒有問題的,可以知道 client 屬性既是一個 NSView,又符合 NSTextInputClient 協議。然而它對應的 Swift 3 版本為:

class NSCandidateListTouchBarItem<CandidateType: AnyObject> : NSTouchBarItem { var client: NSView?}

僅僅是一個 NSView 類型 /(ㄒoㄒ)/~~

在 Swift 4 中,這類 API 做了優化,改成了:

class NSCandidateListTouchBarItem<CandidateType: AnyObject> : NSTouchBarItem { var client: (NSView & NSTextInputClient)?}

這樣類型的聲明就更加嚴謹了。

Associated Type 可以追加 Where 約束語句

在 Swift 4 中可以在 associatedtype 后面聲明的類型后追加 where 語句

associatedtype Element where <xxx>

看下面是 Swift 4 標準庫中 Sequence 中 Element 的聲明:

protocol Sequence { associatedtype Element where Self.Element == Self.Iterator.Element // ...}

它限定了 Sequence 中 Element 這個類型必須和 Iterator.Element 的類型一致。

通過 where 語句可以對類型添加更多的約束,使其更嚴謹,避免在使用這個類型時做多余的類型判斷。

新的 Key Paths 語法

先來看看 Swift 3 中 Key Paths 的寫法:

@objcMembers class Kid: NSObject { dynamic var nickname: String = "" dynamic var age: Double = 0.0 dynamic var friends: [Kid] = []}var ben = Kid(nickname: "Benji", age: 5.5)let kidsNameKeyPath = #keyPath(Kid.nickname)let name = ben.valueForKeyPath(kidsNameKeyPath)ben.setValue("Ben", forKeyPath: kidsNameKeyPath)

Swift 4 中創建一個 KeyPath 用 `` 作為開頭:

/Kid.nickname

當編譯器可以推導出類型時,可以省略基礎類型部分:

/.nickname

上面的代碼在 Swift 4 中就可以這樣寫:

struct Kid { var nickname: String = "" var age: Double = 0.0 var friends: [Kid] = []}var ben = Kid(nickname: "Benji", age: 8, friends: [])let name = ben[keyPath: /Kid.nickname]ben[keyPath: /Kid.nickname] = "BigBen"

相比 Swift 3,Swift 4 的 Key Paths 具有以下優勢:

  1. 類型可以定義為 class、struct
  2. 定義類型時無需加上 @objcMembers、dynamic 等關鍵字
  3. 性能更好
  4. 類型安全和類型推斷,例如 ben.valueForKeyPath(kidsNameKeyPath) 返回的類型是 Any,ben[keyPath: /Kid.nickname] 直接返回 String 類型
  5. 可以在所有值類型上使用

下標支持泛型

有時候會寫一些數據容器,Swift 支持通過下標來讀寫容器中的數據,但是如果容器類中的數據類型定義為泛型,以前的下標語法就只能返回 Any,在取出值后需要用 as? 來轉換類型。Swift 4 定義下標也可以使用泛型了。

struct GenericDictionary<Key: Hashable, Value> { private var data: [Key: Value] init(data: [Key: Value]) { self.data = data } subscript<T>(key: Key) -> T? { return data[key] as? T }}let dictionary = GenericDictionary(data: ["Name": "Xiaoming"])let name: String? = dictionary["Name"] // 不需要再寫 as? String

二、字符串

Unicode 字符串在計算 count 時的正確性改善

在 Unicode 中,有些字符是由幾個其它字符組成的,比如 é 這個字符,它可以用 /u{E9} 來表示,也可以用 e 字符和上面一撇字符組合在一起表示 /u{65}/u{301}。

考慮以下代碼:

var family = "
注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜视频在线观看| 亚洲欧美日韩爽爽影院| 韩日欧美一区二区| 日日狠狠久久偷偷四色综合免费| 国产精品伦子伦免费视频| 欧美极度另类性三渗透| 欧美猛交ⅹxxx乱大交视频| 亚洲国产精品久久久久秋霞不卡| 日韩视频免费中文字幕| 少妇高潮久久77777| 亚洲免费影视第一页| 亚洲第一精品福利| 日本久久久久亚洲中字幕| 九九久久国产精品| 亚洲欧美日韩图片| 国产精品网站大全| 欧美午夜激情在线| 久久夜色精品国产欧美乱| 97视频在线观看免费| 91久久综合亚洲鲁鲁五月天| 亚洲欧美另类人妖| 国产在线视频不卡| 91久久国产精品| 2018中文字幕一区二区三区| 亚洲精品国产品国语在线| 欧美日本在线视频中文字字幕| www.久久久久| 国产日韩欧美视频在线| 国产日韩中文字幕在线| 亚洲精品aⅴ中文字幕乱码| 在线观看免费高清视频97| 精品久久中文字幕| 亚洲欧美日韩视频一区| 国产精品免费在线免费| 日韩中文娱乐网| 国产视频精品xxxx| 国产精品久久久久av免费| 91久久精品国产91久久性色| 在线观看免费高清视频97| 亚洲乱码国产乱码精品精天堂| 成人午夜激情网| 黑人精品xxx一区一二区| 国产精品久久在线观看| **欧美日韩vr在线| 中文在线资源观看视频网站免费不卡| 欧美大尺度电影在线观看| 黑人巨大精品欧美一区二区三区| 久久久久久久影院| 国产亚洲美女精品久久久| 成人久久久久久| 国内精品久久久久久中文字幕| 一区二区三区在线播放欧美| 欧美性生交xxxxx久久久| 亚洲毛片在线观看.| 国产精品一区二区三| 国产女人精品视频| 国产精品久久婷婷六月丁香| 91黑丝高跟在线| 久久成人av网站| 国产精品旅馆在线| 久久精品成人一区二区三区| 日韩av网站在线| 日韩中文字幕久久| 国产欧美va欧美va香蕉在线| 这里只有精品视频在线| 色哟哟亚洲精品一区二区| 欧美一级高清免费| 91精品国产高清| 亚洲v日韩v综合v精品v| 亚洲一区二区三区在线免费观看| 国产欧美亚洲精品| 亚洲精品720p| 久久99久久99精品免观看粉嫩| 伊人亚洲福利一区二区三区| 亚洲aⅴ男人的天堂在线观看| 久久精视频免费在线久久完整在线看| 欧美成人精品在线视频| 欧美中文字幕在线视频| 性色av一区二区三区红粉影视| 91精品国产综合久久久久久蜜臀| 亚洲精品动漫久久久久| 欧美激情精品久久久久久免费印度| 亚洲欧洲国产伦综合| 日韩av123| 美乳少妇欧美精品| 亚洲一区二区三区777| 亚洲色图15p| 亚洲第一区中文字幕| 亚洲精品一区二区三区婷婷月| 精品久久中文字幕| 亚洲视频777| 中文字幕日韩免费视频| 日韩最新中文字幕电影免费看| 亚洲欧美精品一区二区| 亚洲欧美国产日韩天堂区| 国产精品夜色7777狼人| 日韩女在线观看| 欧美高清第一页| 国产亚洲精品久久久久久777| 国产mv免费观看入口亚洲| 亚洲影院色在线观看免费| 久久久久久久久久久亚洲| 中文字幕在线看视频国产欧美在线看完整| 久久在线免费视频| 欧美亚洲成人xxx| 亚洲自拍另类欧美丝袜| 国产一区二区日韩精品欧美精品| 国产精品久久久久久网站| 狠狠爱在线视频一区| 国产噜噜噜噜久久久久久久久| 欧美另类老女人| 成人有码在线视频| 久久99精品久久久久久青青91| 亚洲xxx视频| 97超碰蝌蚪网人人做人人爽| 黑人精品xxx一区一二区| 亚洲精品动漫久久久久| 日韩欧美中文第一页| 久久久久久久久久国产| 欧美最近摘花xxxx摘花| 亚洲欧美www| 好吊成人免视频| 精品亚洲精品福利线在观看| 成人a免费视频| 热久久99这里有精品| 97色在线观看| 日韩精品免费电影| 国产精品色婷婷视频| 欧美一区二区三区艳史| 欧美在线精品免播放器视频| 欧美精品手机在线| 欧美极品少妇xxxxⅹ免费视频| 日韩av一区在线观看| 亚洲精品一区av在线播放| 亚洲桃花岛网站| 欧美高清视频在线| 国产精品久久久久久久久久ktv| 亚洲美女av在线| 狠狠色狠狠色综合日日五| 日本精品视频网站| 91精品久久久久久久久| 久久精品99久久久久久久久| 欧美一乱一性一交一视频| 国产成+人+综合+亚洲欧美丁香花| 九九热在线精品视频| 中文字幕精品久久久久| 国产欧美欧洲在线观看| 日韩美女写真福利在线观看| 亚洲欧美一区二区三区情侣bbw| 欧美综合一区第一页| 在线电影av不卡网址| 91系列在线观看| 亚洲乱码av中文一区二区| 在线视频日韩精品| 91人成网站www| 亚洲区bt下载| 超碰91人人草人人干| 韩国视频理论视频久久| 久久精品国亚洲| 成人免费观看网址| 欧美亚洲日本网站| 欧美网站在线观看| 国产精品视频精品| 日韩免费观看在线观看|