為什麼swift不設計成動態語言? 實際項目中應用Swift相對OC有什麼優勢?

個人感覺, Swift那些閉包, 函數式之類的所謂優勢, 在OC裡邊用block也很容易實現(達到類似效果), 但是swift靜態語言的特性, 使好多一些在工程上很方便的應用(比如, ORM, JSON Model Mapping, 自動載入等)無法用原生Swift實現(不繼承NSObject), 那麼為什麼Swift不設計成動態語言? 對比OC, 在實際商業項目中應用有什麼優勢?

------------------- 時隔半年繼續補充-----------------

這段時間也用 OC+swift 混編做了一個不算小的項目, OC 做底層, swift 做 UI, 感覺配合還挺好,swift 用在 UI 這種不太需要動態性的地方, 強類型靜態特性反而是個優勢。

但是貌似蘋果未來是要放棄 OC 的, 而且現在 swift 兼容 OC, 才加入@objc, dynamic 等,與 OC 共用運行時, 但是 swift 原生的方法, 是不會出現在運行時環境的, 也就是說, 未來 OC 退出舞台之後, swift 也將變成純靜態語言, 那麼現在好多使用 OC 運行時實現的很方便的功能, 比如 JSON 和 Model 的 mapping, 操作資料庫的 Active Record 等功能, 以後是不是就無法實現了?(或者得手寫一堆代碼,或者用工具生成代碼)。


為什麼要靜態類型,你告訴編譯器越多,編譯器能幫你的也就越多。

不粉不黑,不過最開始用swift的,修語法變動修的爽不爽啊~

因為swift已經被設計成能和objc交互,你要動態去寫objc模塊,然後混編不就好了,當然隱形的成本你要自己把握。

OC runtime沒有垃圾收集器,只有ARC和ref counting,你怎麼把動態語言跑在那上面?

當然也不是說一定不行,然而這樣做太沒有apple風格了(逃

objc-auto.mm里的有個變數叫做UseGC,這個存在於幾百個版本號里,還有在新的runtime,有個新結構,發個圖吧,具體自己體會了

運行時不能修改類結構的都只能算模仿COM的傳統OO語言。

這個嘛,只能說無腦瞎java亂黑。


從市場角度考慮:

Swift在可實現的範圍內,比OC的實現成本要低很多,那麼在Swift和OC具備同等技術產出的情況下,市場對Swift方案的項目回報率和周期都要更好些。然後你就會看到供求關係引起的一系列現象了。

從技術角度考慮:

Swift出生晚,包袱少,新特性多,有OC的經驗積累,蘋果對其支持力度大,目前不穩定、不完善,我覺得無可厚非。所以後期Swift技術環境和氛圍肯定要比OC好很多。

技術人容易產生技術推進市場的錯覺,實質上應該是因為技術發展支持了商業模式的實現,使得本來就有的市場需求有了產品或模式去滿足,也就是技術優劣的本質上是以服務於其他業務需求效果的好壞決定的。如果一項技術只是技術人群體內自嗨,而不產出,或者投資回報率低下,那必須淘汰掉,因為它是在浪費資源。

說句現實點的話:你一萬個不願,招得住蘋果的指揮棒?現實點吧,何況國內有能跟Swift創造者能力相當的人物么?沒有就謙虛點,大神再弱,也比凡夫俗子強。

Swift還年輕,OC很成熟,誰強誰弱?答案是:時間。


反正我司半年前已經全面使用Swift了,也沒遇到OC能解決而Swift解決不了的問題。(時間截點當然是從可以在Today Exention快速開關的Personal VPN項目做完後,逃


動態一時爽, 全家火葬場

重構時呢?


為什麼不設計成動態語言我不知道,但是個人認為swift相對oc來說優點還是非常多

Swift. A modern programming language that is safe, fast, and interactive.

這句話就很好概括了swift優點 的一部分。

modern: 語言更加現代,語法更加cool,吸收了很多語言的優點。

Safe:由於swift的strong static type system,編譯器可幫你檢查出更多問題,而不是在運行時突然boom。畢竟編譯器是你的朋友。當然swift整個設計上處處透露出safe的特性,比如optionnal等。

Fast:靜態相對來說語言本身速度更快,swift編譯期就能生成vtable,確定具體要調用的方法,比起oc的動態派發自然是更快,當然處理到與oc之間橋接部分,可能不一定比oc快:)

Interactive:這啥?指playground的?

此外還有非常重要的幾點

value-types在swift中more powerful,使很多適合的地方可以更多的使用value type,而不是reference type,從而減少很多難以發現的問題。

以及Protocol Oriented Programming,雖然稍微有丁點代碼追求的oc程序員在編寫oc的代碼時,都會注重POP,但是在swift中protocol+extension+Generic會更好的實踐POP的思想,可實現更合理和高擴展性的設計,可以看看蘋果在api中的實際運用,非常優雅。

此外最重要以及最致命的一點:誰也料不準今後蘋果會不會強推swift,放棄oc的支持,或者變相上放棄。那到時轉swift還不如現在未雨綢繆。

至於缺少oc動態性部分,個人認為還得想想很多地方是否真得需要用method swizzling、isa swizzling等等,而不是純粹為了炫技而炫技。而真得實現的模塊,完全也可以通過繼承nsobject,後使用oc的runtime來實現。


說一點, Discriminated Union, 也就是swift里的enum. 是靜態語言獨有的特性.


OC runtime沒有垃圾收集器,只有ARC和ref counting,你怎麼把動態語言跑在那上面?

當然也不是說一定不行,然而這樣做太沒有apple風格了(逃


就說字元串處理這一件事上,Swift已經甩OC三百萬條街了好嗎……

但是Swift泛用性還是不夠強,如果項目不止涉及常用的http啊xmpp啊之類的協議,而是要做一些SIP啊FFMPEG啊之類的幹活,那明顯是OC成熟得多。主要是跟C/C++混編起來方便。


Swift相對OC開發效率容錯性不要太高好嘛


推薦閱讀:

TAG:iOS | 編程語言 | 編程 | ObjectiveC | Swift語言 |