在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>通訊/手機(jī)編程>

解析Swift 3.0預(yù)告的新變化

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

  原因

  這個(gè)源于一個(gè)編號(hào)為 SE-0005 的提案,并且已經(jīng)審核通過(guò)。這個(gè)方案的提出,源于這樣一個(gè)痛點(diǎn)。 Swift 應(yīng)用于 iOS App 開(kāi)發(fā),就免不了會(huì)依賴于原生的 Cocoa Touch 庫(kù)。而由于歷史原因,大家也都知道, iOS 原生庫(kù)大多時(shí)基于 Objc 來(lái)實(shí)現(xiàn)的。所以他們的編碼規(guī)范也都遵循著 Objc 的規(guī)范,諸如函數(shù),方法的命名規(guī)則這些,都有自己的一套標(biāo)準(zhǔn)。

  而 Swift 3.0 也發(fā)布了自己的 API 設(shè)計(jì)規(guī)范,同時(shí) Objc 也有自己的設(shè)計(jì)規(guī)范, 這樣一來(lái)我們使用 Swift 開(kāi)發(fā) iOS App 的時(shí)候,其實(shí)總是在游走于兩套規(guī)范的 API 之間,對(duì)開(kāi)發(fā)者的體驗(yàn)嘛,就不是很好了。

  例子

  咱們用一個(gè)實(shí)際的例子來(lái)說(shuō)明這個(gè)問(wèn)題。 比如 NSString 有這樣一個(gè)方法:

  letcontent = listItemView.text.stringByTrimmingCharactersInSet(

  NSCharacterSet.whitespaceAndNewlineCharacterSet())

  stringByTrimmingCharactersInSet 會(huì)剪掉字符串頭尾中的某些字符。從這個(gè)方法名中,明顯的可以看出它是以 Objc 規(guī)范來(lái)命名的。

  如果以 Swift 的編碼規(guī)范,這個(gè)方法其實(shí)應(yīng)該這樣命名:

  letcontent = listItemView.text.trimming(.whitespaceAndNewlines)

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

  所以 Swift 3.0 才會(huì)將這個(gè)問(wèn)題提上日程,并在這個(gè)版本中準(zhǔn)備解決這個(gè)問(wèn)題。

  規(guī)則

  解決這個(gè)問(wèn)題,肯定不能手動(dòng)的替換。因?yàn)橄到y(tǒng)庫(kù)的方法實(shí)在太多了,所以就需要總結(jié)出一系列替換規(guī)則。根據(jù)這些規(guī)則將相應(yīng)的標(biāo)識(shí)替換完成。

  那么 Swift 具體是怎么做的呢, 咱們來(lái)了解一下。

  擴(kuò)大 swift_name 編譯屬性的應(yīng)用范圍- 這個(gè)涉及到 Swift 底層的概念,當(dāng)我們將 Objc 的 API 導(dǎo)入到 Swift 的時(shí)候,我們是可以指定一個(gè)編譯屬性swift_name 的。而這個(gè)編譯屬性,可以將 Objc 中的標(biāo)識(shí)名稱在 Swift 中以不同的名字表現(xiàn)出來(lái)。但在之前的版本中,這個(gè)編譯屬性只能對(duì)枚舉項(xiàng)和工廠方法有效,這次將會(huì)擴(kuò)大它的范圍。

  去除多余的類型名稱- Objc 的編碼規(guī)范中,會(huì)建議在方法名稱中將參數(shù)名和類型也表示出來(lái),而這個(gè)在 Swift 中就是多余的,我們前面那個(gè)例子也演示了。這個(gè)也是著重處理的點(diǎn)。

  添加默認(rèn)參數(shù)- 對(duì)于 Objc 需要默認(rèn)參數(shù)的地方,會(huì)在 Swift 中添加上默認(rèn)參數(shù),比如一些選項(xiàng)參數(shù):

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

  這個(gè) option 參數(shù)就會(huì)提供默認(rèn)參數(shù)。

  添加第一個(gè)參數(shù)的參數(shù)標(biāo)簽- 為方法的第一個(gè)參數(shù)添加合適的參數(shù)標(biāo)簽。

  在布爾屬性前面加上 is- 在最新的 Swift 規(guī)范中,需要在布爾屬性前面加上 is, 而 Objc 規(guī)范恰巧不建議使用 is,所以在 Swift 3 中會(huì)將 Objc 遷移過(guò)來(lái)的布爾屬性,按照 Swift 規(guī)范來(lái)進(jìn)行修改。可以參考 Swift 規(guī)范中關(guān)于布爾屬性的部分內(nèi)容。

  值類型變成小寫(xiě)- 會(huì)將 Objc 的屬性值以小寫(xiě)開(kāi)頭, 比如 URLHandler 會(huì)變?yōu)?urlHandler.

  下面是一個(gè)官方文檔中給出的轉(zhuǎn)換的例子:

  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)

  }

  轉(zhuǎn)換后:

  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)

  }

  是不是感覺(jué)方法名清晰很多呢。

  總結(jié)

  以上就是 Swift 3 對(duì) Objc 依賴庫(kù)中的優(yōu)化了,這次優(yōu)化后,我們以后在用 Swift 來(lái)開(kāi)發(fā) iOS App 的時(shí)候,就不會(huì)再混合兩種代碼風(fēng)格啦。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

      發(fā)表評(píng)論

      用戶評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?
      主站蜘蛛池模板: 三级毛片在线免费观看 | 种子 在线播放 | 免费男女| 久久国产乱子伦精品免 | 欧美ol丝袜高跟秘书在线播放 | 天堂8资源8在线 | 亚洲成片在线观看12345ba | 日本女人啪啪 | 黄色录像视频网站 | 欧美人与动性xxxxbbbb | 亚偷熟乱区视频在线观看 | h视频在线观看免费网站 | 亚洲一区二区三区首页 | 国产精品资源在线观看网站 | 伊人网综合在线 | 久久精品香蕉视频 | 18女人毛片 | 亚洲成人高清在线观看 | 一级特黄aaa大片29 | 黄字幕网 | 亚洲国产第一区二区香蕉 | 夜夜综合网 | 中国美女一级黄色片 | 嫩草影院播放地址一二三 | 国产亚洲一区二区在线观看 | 欧美色伊人| 狠狠轮 | 亚洲欧美日韩综合一区 | 日日干夜夜爽 | 欧美极品xxxxⅹ另类 | 成年啪啪网站免费播放看 | 欧美精品成人久久网站 | 四虎国产精品永久免费网址 | 色综合天天综合网亚洲影院 | 国产美女主播一级成人毛片 | 中文字幕亚洲一区二区va在线 | 日本一区二区三区免费看 | 视频在线一区二区 | 国产gaysexchina男同men1068 | 天天综合色天天综合 | 亚洲日本免费 |