<th id="ik4gr"><pre id="ik4gr"></pre></th>
<rp id="ik4gr"></rp>
    <dd id="ik4gr"></dd>

  1. <rp id="ik4gr"><object id="ik4gr"><blockquote id="ik4gr"></blockquote></object></rp>
      <rp id="ik4gr"></rp>
        <button id="ik4gr"><acronym id="ik4gr"></acronym></button>
      1. <rp id="ik4gr"><object id="ik4gr"><input id="ik4gr"></input></object></rp>
        1. 杭州嵌入式培訓
          達內杭州嵌入式培訓中心

          13175137725

          ios開發之Swift 4.2新特性

          • 時間:2018-11-21 11:15
          • 發布:轉載
          • 來源:網絡

          這篇文章講述了ios開發中Swift 4.2 新特性,還有靜態庫相關問題的解決教程及Xcode的設置教程。小編今天做了一個整理分析給大家!分享開發中遇到的問題,和相關的一些思考。

          語法

          這個特性中文可以叫動態查找成員。在使用@dynamicMemberLookup標記了對象后(對象、結構體、枚舉、protocol),實現了subscript(dynamicMember member: String)方法后我們就可以訪問到對象不存在的屬性。如果訪問到的屬性不存在,就會調用到實現的subscript(dynamicMember member: String)方法,key 作為 member 傳入這個方法。

          比如我們聲明了一個結構體,沒有聲明屬性。

          @dynamicMemberLookup struct Person { subscript(dynamicMember member: String) -> String { let properties = ["nickname": "Zhuo", "city": "Hangzhou"] return properties[member, default: "undefined"] }} //執行以下代碼 let p = Person() print(p.city) print(p.nickname) print(p.name)

          如果沒有聲明@dynamicMemberLookup的話,執行的代碼肯定會編譯失敗。很顯然作為一門類型安全語言,編譯器會告訴你不存在這些屬性。但是在聲明了@dynamicMemberLookup后,雖然沒有定義city等屬性,但是程序會在運行時動態的查找屬性的值,調用subscript(dynamicMember member: String)方法來獲取值。

          ios開發中Swift 4.2 新特性

          這樣安全嗎?

          Swift 面世時就大談自己的安全特性,現在來了這么一個無限制訪問的成員萬一返回的是nil不就閃退了?是的,出于安全的原因,如果實現了這個特性,你就不能返回可選值。必須處理好意料外的情況,一定要有值返回。不像常規的subscript方法可以返回可空的值。

          說好的動態查找,如果兩個屬性類型不一樣怎么破

          這個方法可以被重載。和泛型的邏輯類似,會根據你要的返回值而通過類型推斷來選擇對應的subscript方法。

          @dynamicMemberLookup struct Person { subscript(dynamicMember member: String) -> String { let properties = ["nickname": "Zhuo", "city": "Hangzhou"] return properties[member, default: "undefined"] } subscript(dynamicMember member: String) -> Int { return 18 }}

          但是執行的時候就一定要告訴編譯器你要獲取的屬性是什么類型的,否則會編譯錯誤。

          let p = Person() let age: Int = p.age print(age) // 18

          Swift 中函數是一等公民,所以返回函數也是可以的。

          @dynamicMemberLookup struct Person { subscript(dynamicMember member: String) -> (_ input: String) -> Void { return { print("Hello! I live at the address \($0).") } }}

          居然可以繼承!

          需要注意的是如果聲明在類上,那么他的子類也會具有動態查找成員的能力。

          @dynamicMemberLookup class User { subscript(dynamicMember member: String) -> String { return "user" }} class Developer: User { } let dev = Developer()dev.name // "user"

          雖然想起來應該是這樣,但是還是很反直覺。因為大多數開發者沒想過繼承一個類后,會有失去屬性拼寫檢查的副作用。這樣可能不小心寫錯了屬性的名字編譯器也不會告訴你。

          所以聲明在類上的時候一定要特別謹慎。

          當然如果想害同事,在BaseViewController里聲明是個好主意。


          這個特性的感覺就是乍一看很厲害的樣子,仔細一看好像就這么回事,再冷靜想想似乎沒有這么簡單。


          這個東西本質上只是一個語法糖,和數組的subscript類似。

          let numbers = [1, 2] let firstItem = number[0] //這個語法最后還是調用到了一個方法,如果沒有這種寫法,類似 oc 的時候就需要顯式的調用一個方法 NSNumber *firstItem = [numnber obbjectAtIndex: 0];

          原來你需要顯式聲明字符串參數的地方,可以不用是字符串的形式,可以直接用點語法訪問。官方舉的例子是 JSON 的使用。

          常規的寫法是這樣的:

          json[0]?["name"]?["first"]?.stringValue

          如果像這樣定義動態查找成員:

          @dynamicMemberLookup enum JSON { case intValue(Int) case stringValue(String) case arrayValue(Array) case dictionaryValue(Dictionary) var stringValue: String? { if case .stringValue(let str) = self { return str } return nil } subscript(index: Int) -> JSON? { if case .arrayValue(let arr) = self { return index < arr.count ? arr[index] : nil } return nil } subscript(key: String) -> JSON? { if case .dictionaryValue(let dict) = self { return dict[key] } return nil } subscript(dynamicMember member: String) -> JSON? { if case .dictionaryValue(let dict) = self { return dict[member] } return il }}

          那么寫起來就會是這樣:

          json[0]?.name?.first?.stringValue

          實現方案

          這個功能的實現原理很簡單,就是編譯器幫助你把點語法轉化為下標的語法:

          a = someValue.someMember //編譯器處理后 a = someValue[dynamicMember: "someMember"]

          動態屬性其實并不陌生,回憶一下 OC 里的屬性就是動態合成的。聲明了@property后,編譯器幫你生成get、set方法。與之類似,在聲明了動態查找成員后,編譯器幫你轉換成了對應的方法。

          然而事情并沒有這么簡單

          如果你以為這只是一個語法糖,那你就錯了。

          獨有的身世暴露了你

          這個 pr 是由已經離開蘋果加入谷歌的 swift 創始人 CL 提出的。他不僅提了這個 pr,而且還自己實現了。果然是 swift 是親兒子,身在曹營還不忘為 swift 添磚加瓦。而且大佬不僅提了這個,還提了一個 @dynamicCallable 。

          當你給一個對象標記@dynamicCallable后,可以動態的給傳參。

          // 常規操作 a = someValue(keyword1: 42, "foo", keyword2: 19) // dynamicallyCall a = someValue.dynamicallyCall(withKeywordArguments: [ "keyword1": 42, "": "foo", "keyword2": 19 ])

          是的,這很 JS。

          ios開發中Swift 4.2 新特性

          大佬就是大佬,要啥有啥。目前@dynamicCallable的進度已經在 review 中,也許 5.0 的時候能夠上?我猜測 swift 團隊想這兩個特性都開發完后一起宣布所以這次發布會沒有介紹。

          另有所謀:把 Python 和 JS 納入懷中

          Swift 目前可以”良好“的和 C、OC 交互。然而程序的世界里還有一些重要的動態語言,比如 Python 、 JS,emmm,還有有實力但是不太主流的 Perl、Ruby。如果 swift 能夠愉快的的調用 Python 和 JS 的庫,那么毫無疑問會極大的拓展的 swift 的邊界。

          這里需要一點想象力,因為這個設計真正的意義是@dynamicMemberLookup、@dynamicCallable組合起來用。通過@dynamicMemberLookup動態的返回一個函數,再通過@dynamicCallable來調用。從語法層面來講,這種姿態下 swift 完完全全是一門動態語言。

          @dynamicCallable @dynamicMemberLookup class WeiSuoYuWei {} let niuBi = WeiSuoYuWei()niuBi.someMethod.dynamicallyCall(withKeywordArguments: ["wei_suo_yu_wei": true])

          就像上面的代碼展示的,你不必聲明過someMethod也可以通過動態特性調用到,合法的傳參。真的可以為所欲為!

          據說谷歌的 TensorFlow For Swift 能夠順利的開發就是依靠了這個特性。CL 是這么說的:

          While this is a syntactic sugar proposal, we believe that this expands Swift to be usable in important new domains

          以上就是本篇內容的全部了,這一篇ios開發中Swift 4.2 新特性:調整動畫執行出錯問題教程希望可以對各位ios程序員有所幫助。

          預約申請免費試聽課

          怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

          上一篇:ios開發之iOS項目組件化搭建
          下一篇:現代汽車的新LOGO..

          零基礎入門平面設計怎么學習好

          UI設計小技巧推薦

          APP數據可視化設計實戰分享

          我們從未真正了解過色彩~

          • 掃碼領取資料

            回復關鍵字:視頻資料

            免費領取 達內課程視頻學習資料

          • 視頻學習QQ群

            添加QQ群:1143617948

            免費領取達內課程視頻學習資料

          Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

          選擇城市和中心
          江西省

          貴州省

          廣西省

          海南省

          香蕉视频在线一级a做爰片免费观看视频 欧美成年性色生活片 百度 好搜 搜狗
          <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>