色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>通訊/手機編程>

解析Swift 3.0預告的新變化

大小:0.3 MB 人氣: 2017-09-26 需要積分:1

  原因

  這個源于一個編號為 SE-0005 的提案,并且已經審核通過。這個方案的提出,源于這樣一個痛點。 Swift 應用于 iOS App 開發,就免不了會依賴于原生的 Cocoa Touch 庫。而由于歷史原因,大家也都知道, iOS 原生庫大多時基于 Objc 來實現的。所以他們的編碼規范也都遵循著 Objc 的規范,諸如函數,方法的命名規則這些,都有自己的一套標準。

  而 Swift 3.0 也發布了自己的 API 設計規范,同時 Objc 也有自己的設計規范, 這樣一來我們使用 Swift 開發 iOS App 的時候,其實總是在游走于兩套規范的 API 之間,對開發者的體驗嘛,就不是很好了。

  例子

  咱們用一個實際的例子來說明這個問題。 比如 NSString 有這樣一個方法:

  letcontent = listItemView.text.stringByTrimmingCharactersInSet(

  NSCharacterSet.whitespaceAndNewlineCharacterSet())

  stringByTrimmingCharactersInSet 會剪掉字符串頭尾中的某些字符。從這個方法名中,明顯的可以看出它是以 Objc 規范來命名的。

  如果以 Swift 的編碼規范,這個方法其實應該這樣命名:

  letcontent = listItemView.text.trimming(.whitespaceAndNewlines)

  從這里可以看出,objc 的命名方式,很多會把函數的返回值類型,以及參數類型都包含在函數名里面。比如我們上面的stringByTrimmingCharactersInSet 方法。但這和 Swift 命名規則就不同了。而且隨著 Swift 規范的清晰,這個問題就越來越凸顯出來了。

  所以 Swift 3.0 才會將這個問題提上日程,并在這個版本中準備解決這個問題。

  規則

  解決這個問題,肯定不能手動的替換。因為系統庫的方法實在太多了,所以就需要總結出一系列替換規則。根據這些規則將相應的標識替換完成。

  那么 Swift 具體是怎么做的呢, 咱們來了解一下。

  擴大 swift_name 編譯屬性的應用范圍- 這個涉及到 Swift 底層的概念,當我們將 Objc 的 API 導入到 Swift 的時候,我們是可以指定一個編譯屬性swift_name 的。而這個編譯屬性,可以將 Objc 中的標識名稱在 Swift 中以不同的名字表現出來。但在之前的版本中,這個編譯屬性只能對枚舉項和工廠方法有效,這次將會擴大它的范圍。

  去除多余的類型名稱- Objc 的編碼規范中,會建議在方法名稱中將參數名和類型也表示出來,而這個在 Swift 中就是多余的,我們前面那個例子也演示了。這個也是著重處理的點。

  添加默認參數- 對于 Objc 需要默認參數的地方,會在 Swift 中添加上默認參數,比如一些選項參數:

  NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)

  這個 option 參數就會提供默認參數。

  添加第一個參數的參數標簽- 為方法的第一個參數添加合適的參數標簽。

  在布爾屬性前面加上 is- 在最新的 Swift 規范中,需要在布爾屬性前面加上 is, 而 Objc 規范恰巧不建議使用 is,所以在 Swift 3 中會將 Objc 遷移過來的布爾屬性,按照 Swift 規范來進行修改。可以參考 Swift 規范中關于布爾屬性的部分內容。

  值類型變成小寫- 會將 Objc 的屬性值以小寫開頭, 比如 URLHandler 會變為 urlHandler.

  下面是一個官方文檔中給出的轉換的例子:

  classUIBezierPath: NSObject, NSCopying, NSCoding{

  convenience init(ovalInRect: CGRect)

  funcmoveToPoint(_: CGPoint)

  funcaddLineToPoint(_: CGPoint)

  funcaddCurveToPoint(_: CGPoint, controlPoint1: CGPoint, controlPoint2: CGPoint)

  funcaddQuadCurveToPoint(_: CGPoint, controlPoint: CGPoint)

  funcappendPath(_: UIBezierPath)

  funcbezierPathByReversingPath()-》 UIBezierPath

  funcapplyTransform(_: CGAffineTransform)

  varempty: Bool{ get}

  funccontainsPoint(_: CGPoint)-》 Bool

  funcfillWithBlendMode(_: CGBlendMode, alpha: CGFloat)

  funcstrokeWithBlendMode(_: CGBlendMode, alpha: CGFloat)

  funccopyWithZone(_: NSZone)-》 AnyObject

  funcencodeWithCoder(_: NSCoder)

  }

  轉換后:

  classUIBezierPath: NSObject, NSCopying, NSCoding{

  convenience init(ovalIn rect: CGRect)

  funcmove(to point: CGPoint)

  funcaddLine(to point: CGPoint)

  funcaddCurve(to endPoint: CGPoint, controlPoint1 controlPoint1: CGPoint, controlPoint2 controlPoint2: CGPoint)

  funcaddQuadCurve(to endPoint: CGPoint, controlPoint controlPoint: CGPoint)

  funcappend(_bezierPath: UIBezierPath)

  funcreversing()-》 UIBezierPath

  funcapply(_transform: CGAffineTransform)

  varisEmpty: Bool{ get}

  funccontains(_point: CGPoint)-》 Bool

  funcfill(_blendMode: CGBlendMode, alpha alpha: CGFloat)

  funcstroke(_blendMode: CGBlendMode, alpha alpha: CGFloat)

  funccopy(with zone: NSZone = nil)-》 AnyObject

  funcencode(with aCoder: NSCoder)

  }

  是不是感覺方法名清晰很多呢。

  總結

  以上就是 Swift 3 對 Objc 依賴庫中的優化了,這次優化后,我們以后在用 Swift 來開發 iOS App 的時候,就不會再混合兩種代碼風格啦。

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 乱辈通奷XXXXXHD猛交| 亚洲精品在线免费| 解开白丝老师的短裙猛烈进入| 伊人久久综合影院| 日韩亚洲国产欧美免费观看| 精品日韩欧美一区二区三区| 不良网站进入窗口软件下载免费 | 亚洲性夜夜色综合网站| 人妻免费视频公开上传| 久久精品AV一区二区无码| 国产精品97久久AV麻豆| 91看片淫黄大片.在线天堂| 亚洲精品国产在线观看| 色噜噜噜亚洲男人的天堂| 蜜桃人妻无码AV天堂三区| 午夜福利92看看电影80| 欧美精品高潮呻吟AV久久 | 日韩精品一区二区亚洲AV观看| 久久99r66热这里有精品| 国产97视频在线观看| av色天堂2018在线观看| 日日摸夜夜添无码AVA片| 开心色99xxxx开心色| 黄色天堂网站| 国产乱对白精彩在线播放| 成人综合在线观看| av网站视频在线观看| 中文字幕一区二区视频| 一二三四在线视频社区8| 香蕉尹人综合精品| 天天躁日日躁狠狠躁中文字幕老牛| 国产特级毛片AAAAAAA高清| 最近中文字幕完整版免费高清| 亚洲免费无码中文在线| 亚洲国产在线精品国自产拍五月| 少妇精油按摩| 色欲AV人妻精品麻豆AV| 日韩精品人成在线播放| 日韩精品欧美在线视频在线| 日本在线免费播放| 乳欲性高清在线|