1. 程式人生 > >Swift和Objective-C的相同點和不同點

Swift和Objective-C的相同點和不同點

Swift和Objective-C的聯絡

  • Swift與Objective-C共用同一套執行時環境
    我們編寫程式,讓程式執行起來,被機器執行的程式碼並非全部是由我們自己來編寫的。需要同時執行很多預先寫好的支援性的程式碼,才能讓我們自己的程式碼執行起來。程式並非單獨存在的,執行時處在一定的環境當中。我總聯想到很多小螞蟻在泥土上面爬,而我自己寫的程式只是其中的一隻。
    Swift跟Objective-C編譯出的程式程式碼執行在同一套執行環境上面。Swift的型別可以橋接到Objective-C的型別,反之亦然。Swift編寫的程式碼可以呼叫Objective-C編寫的程式碼,反之也一樣。
    Objective-C之前積累下來的大量類庫,實現不用改寫Swift就可以直接呼叫。
  • 同一個工程,可以同時使用Swift和Objective-C
    Objective-C在一端,Swift在另一端,兩端經中間檔案進行橋接。橋接檔案包含Objective-C的標頭檔案,編譯時自動轉成Swift可以識別的形式。Swift就可以使用Objective-C的類和它的函式。
    在Swift的類中,加上@objc(類名)的字樣,Objective-C也可以使用Swift編寫的類。但Swift跟C++的相互呼叫,需要Objective-C來封裝。
  • Swift骨子裡大多與Objective-C一樣
    Objective-C出現過的絕大多數概念,比如引用記數、ARC、屬性、協議、介面、初始化、擴充套件類、命名引數、匿名函式等,在Swift中繼續有效(可能只是換了個術語)。我自己將Swift看成是Objective-C的一塊大大的語法糖,其他人可能有不同感受。
    Swift大多數概念與Objective-C一樣,也有些概念在Objective-C找不到對應,比如泛型。Swift中將那種操作寫一次就可以作用多個型別的語法叫做Generics(泛型)。

Swift比Objective-C有什麼優勢?

  • Swift 容易閱讀
    不再需要行尾的分號,以及 if/else 語句中圍繞條件表示式的括弧。另外就是方法的呼叫不再互相巢狀成中括號[[[ ]]]。Swift 中的方法和函式的呼叫使用行業內標準的在一對括弧內使用逗號分隔的引數列表。這樣做的結果就是一種帶有簡化了句法和語法的更加乾淨有表現力的語言。
  • Swift 更易於維護
    Swift 丟掉了對著兩個檔案的要求。 Xcode編譯器可以自動計算出以來並執行增量構建。如此,將標頭檔案 同實現檔案相分離。把 Objective-C 標頭檔案(.h) 和實現檔案 (.m) 合併成了一個程式碼檔案 (.swift)
  • Swift 更加安全
    Swift程式碼中的可選型別使得一個nil可選值的可能性變得非常的明確, 這意味它能在你寫下一段糟糕的程式碼時會生成一個編譯器錯誤. 這就建立了一種短程反饋的迴圈,可以讓程式設計師帶著目標去寫程式碼. 問題在程式碼被寫就時就可以被修復, 這大大節省了你要在修復有關來自 Objective-C 指標邏輯的bug時需要耗費的時間和金錢.
  • Swift 程式碼更少
    Swift 減少了重複性語句和字串操作所需要的程式碼量。在 Objective-C 中, 使用文字字串將兩塊資訊組合起來的操作非常繁瑣。Swift 採用當代程式語言的特性,比如使用“+”操作符將兩個字串加到一起
    Swift中的型別系統減少了程式碼語句的複雜性–作為編譯器可以理解的型別。比如,Objective-C要求程式設計師記住特殊字元標記(%s,%d,%@)並且提供了一個用逗號分隔的變數來代替每個標記。Swift支援字串插入,這就消除了需要記住的標記和允許程式設計師直接插入變數到面向使用者的字串中
  • Swift 速度更快
    刪除遺留下來的C語言約定大大提升了引擎蓋之下Swift的效能, 進行計算密集型任務的效能上,Swift已經逼近C++的表現, 將近是OC執行速度的1.4倍.
  • 總結: 使用 Swift,程式設計師只要維護原來一半量的程式碼檔案,手動的程式碼同步工作為零,標點輸入出錯的概率也遠遠低於以前 – 這樣就能騰出更多的時間寫高質量的程式碼。通過使用可選型別 —— 一種針對返回或不返回值的編譯時安全機制,而返回值是同步操作、網路失效時無效的使用者輸入以及資料驗證錯誤發生時普遍會遇到的問題。ARC 在 Swift 中對過程式 C 風格的程式碼,還有蘋果公司 Cocoa 框架使用的面向物件程式碼都進行了統一。

Swift的記憶體管理是怎樣的?

  • Swift 使用自動引用計數(Automatic Reference Counting, ARC)來簡化記憶體管理, 這種記憶體管理方式相比GC而言,對程式設計師的要求較高, 並且ARC比GC更容易引起程式設計錯誤,但卻比GC快。尤其在效能很重要的場合。

Swift支援面向過程程式設計嗎?

  • 它採用了 Objective-C 的命名引數以及動態物件模型,可以無縫對接到現有的 Cocoa 框架,並且可以相容 Objective-C 程式碼,支援面向過程程式設計和麵向物件程式設計。

舉例說明Swift裡面有哪些是 Objective-C中沒有的?

  • Swift引入了在Objective-C中沒有的一些高階資料型別,例如tuples(元組),可以使你建立和傳遞一組數值。
  • Swift還引入了可選項型別(Optionals),用於處理變數值不存在的情況。可選項的意思有兩種:一是變數是存在的,例如等於X,二是變數值根本不存在。Optionals類似於Objective-C中指向nil的指標,但是適用於所有的資料型別,而非僅僅侷限於類,Optionals 相比於Objective-C中nil指標更加安全和簡明,並且也是Swift諸多最強大功能的核心。

Swift 是一門安全語言嗎?

  • Swift是一門型別安全的語言,Optionals就是代表。Swift能幫助你在型別安全的環境下工作,如果你的程式碼中需要使用String型別,Swift的安全機制能阻止你錯誤的將Int值傳遞過來,這使你在開發階段就能及時發現並修正問題。

為什麼要在變數型別後面加個問號?

  • 用來標記這個變數的值是可選的,一般用“!”和“?”定義可選變數的區別:用“!”定的可選變數必須保證轉換能夠成功,否則報錯,但定義的變數可以直接使用,不會封裝在option裡;而用“?”號定的可選變數即使轉換不成功本身也不會出錯,變數值為nil,如果轉換成功,要使用該變數進行計算時變數名後需要加“!”

什麼是泛型,它們又解決了什麼問題?

  • 泛型是用來使程式碼能安全工作。在Swift中,泛型可以在函式資料型別和普通資料型別中使用,例如類、結構體或列舉。
  • 泛型解決了程式碼複用的問題。有一種常見的情況,你有一個方法,需要一個型別的引數,你為了適應另一種型別的引數還得重新再寫一遍這個方法。
    比如,在下面的程式碼中,第二個方法是第一個方法的“克隆體”:
func areIntEqual(x: Int, _ y: Int) -> Bool {
  return x == y
}
func areStringsEqual(x: String, _ y: String) -> Bool {
  return x == y
}
areStringsEqual("ray", "ray") // true
areIntEqual(1, 1) // true

一個Objective-C開發者可能會採用NSObject來解決問題:

-    import Foundation
-    func areTheyEqual(x: NSObject, _ y: NSObject) -> Bool {
-      return x == y
-    }
-    areTheyEqual("ray", "ray") // true
-    areTheyEqual(1, 1) // true

這段程式碼能達到了目的,但是編譯的時候並不安全。它允許一個字串和一個整型資料進行比較:

-     areTheyEqual(1, "ray")
//程式可能不會崩潰,但是允許一個字串和一個整型資料進行比較可能不會得到想要的結果。
採用泛型的話,你可以將上面兩個方法合併為一個,並同時還保證了資料型別安全。這是實現程式碼:
-    func areTheyEqual<T: Equatable>(x: T, _ y: T) -> Bool {
-      return x == y
-    }
-    areTheyEqual("ray", "ray")
-    areTheyEqual(1, 1)

相關推薦

SwiftObjective-C相同點不同點

Swift和Objective-C的聯絡 Swift與Objective-C共用同一套執行時環境我們編寫程式,讓程式執行起來,被機器執行的程式碼並非全部是由我們自己來編寫的。需要同時執行很多預先寫好的支援性的程式碼,才能讓我們自己的程式碼執行起來。程式並非單

SwiftObjective-C混合編程——Swift調用OC

分享 發現 load 另一個 == 方法 代碼 swift 應用 在iOS應用的開發中。Swift必將代替OC,兩者的趨勢是“短期共存,長期代替”。但曾經有太多的代碼是用OC語言完畢的,而Swift的開發也從 OC中繼承了非常多的特性。兩者也是有非常多的類

Swift 4 Objective-C 混合編程(一) 快速起步

命名方式 import 編譯器 選擇性 工程 Swift 4 和 Objective-C 在同一個工程裏的混搭編程的方法你可以在 xcode 裏同時使用 Swift 和 Objective-C(以下簡稱OC)來寫代碼,混搭編程的好處很多,比如允許大量代碼的復用,在性能和開發效率之間找到平衡

《隨筆四》——C#中的 “ 索引器屬性的相同點不同點、索引器與陣列的區別、索引器的過載 ”

目錄 索引器和屬性的相同點和不同點 索引器與陣列的區別 索引器的過載 關於索引器的詳細請看這裡《隨筆三》——C#中的“ 索引器”  https://blog.csdn.net/qq_34536551/article/details/83926260 索引器(

iOS入門如何選擇Swiftobjective-c

學oc吧,學完估計也就淘汰了。學swift吧,短時間內普及機率太低,即便學完了,大部分老專案還是用oc.. 不學oc吧,放眼望去現在全是oc,swift完全沒有用武之地。 不學swift吧,說不上那

淺談SwiftObjective-C之間的那點事。。。

Swift 是一種新的程式語言,用於編寫 iOS 和 OS X 應用。Swift 結合了 C 和 Objective-C 的優點並且不受C相容性的限制。Swift 採用安全的程式設計模式並添加了很多新特性,這將使程式設計更簡單,更靈活,也更有趣。Swift 是基

製作 Swift Objective-C Mixed 的 Pod

知識背景 What did CocoaPods do? In Xcode, with references directly from the ruby source, it: Creates or updates a workspace. Adds your proj

Swift開發指南:使用Swift與CocoaObjective-C(Swift 4)

與Objective-C API進行互動 互操作性是能夠在任何一個方向上與Swift和Objective-C進行介面,讓您訪問並使用以其他語言的檔案中的一些程式碼。當您開始將Swift整合到應用程式開發工作流程中時,瞭解如何利用互操作性來重新定義、改進和增

C#JAVA的相同點不同點

2.2、常量 忘掉Java中的static final修飾符。在C#中,常量可以用const關鍵詞宣告。public const int x = 55; 此外,C#的設計者還增加了readonly關鍵詞。如果編譯器編譯時未能確定常量值,你可以使用readonly關鍵詞。readonly域只能通過初始化器或類的

SwiftObjective-C混編

 越來越多的新開發者選擇使用Swift語言來開發程式,但是就目前來看,依然有很多對Objective-C很熟練的開發者,那麼Swift和Objective-C能混編麼?當然,Xcode是支援的,你可以

SwiftObjective-C的相互呼叫

(一)Swift呼叫Objective-C 1)已有的OC專案new file 建立swift 檔案 2)出現如下所示的彈框 配置oc橋接標頭檔案的提示 `LearnSwift-Bridging-Header` 3)點選Create Bri

iOS入門怎樣選擇Swiftobjective-c

art 合作 項目開發 wwdc mil 應該 技術 新手 個人 版權聲明:本文為博主原創文章,未經博主同意不得轉載。博主微信:lofocus https://blog.csdn.net/

Objective-C(裝箱拆箱)

概述  從前面的博文我們也可以看到,陣列和字典中只能儲存物件型別,其他基本型別和結構體是沒有辦法放到陣列和字典中的,當然你也是無法給它們傳送訊息的也就是說有些NSObject的方法是無法呼叫的,這個時候通常會用到裝箱boxing和拆箱unboxing。 其實各種高階語言基本上都有裝箱和拆 箱的過

ios學習路線—Objective-C(裝箱拆箱)

概述 從前面的博文我們也可以看到,陣列和字典中只能儲存物件型別,其他基本型別和結構體是沒有辦法放到陣列和字典中的,當然你也是無法給它們傳送訊息的也就是說有些NSObject的方法是無法呼叫的,這個時候通常會用到裝箱boxing和拆箱unboxing。 其實各種高階語言基本上都有裝箱和拆 箱的過程,

Objective-C 分類類擴充套件

命名分類: ClassA.h: @interface ClassA:NSObject @end ClassA1_CategoryA.h: #import "ClassA.h" @interface ClassA1(CategoryA)

objective-c 裝箱拆箱

NSNumber: 1、裝箱 + (NSNumber*) numberWitChar: (char) value; + (NSNumber*) numberWithInt: (char) value; + (NSNumber*) numberWithFloat: (floa

在 Windows 上安裝使用 GNUstep Objective-C

除了在 Mac 系統上使用 Objective-C,你還可以在 Windows 上下載並安裝 GNUstep 和 Objective-C 環境,接下來我們就介紹詳細的安裝和使用的步驟。 下載 GNUstep GNUstep 環境可通過 Windows 下的 MinGW

Objective-C: ARCNon-ARC混編的問題

假設有個framework是按照non-ARC編譯的,並且有個類方法建立並返回一個物件: +(TestMe *)fetch {     TestMe *obj = [[[TestMe alloc] init] autorelease];     return obj; }

【iOS】WebView的使用、JavascriptObjective-C的互動

現在的App越來越有直接在一個View中擺個WebView,然後裡面鑲嵌個HTML5網頁,再加些和手機系統聯絡的方法的趨勢了。這樣做,以免IOS Apps一套,安卓那邊一套,HTML5的手機網頁版又一套。我都懶得煩了,一套HTML5程式碼吃遍天下,反正現在的HTML5網頁已

iOS webView jsObjective c互動

常見問題, 使用webView時, 常常需要呼叫Objective c的方法。 兩種方式可以完成需求, 簡單記錄方便日後常看。 第一種是網頁js呼叫方法loadURL(); 例如: 網頁端: load