淺談OC和Swift的區(qū)別

本文介紹兩部分
Objcetive-c和Swift的區(qū)別
Swift3.x - Swift5.x的差異

OC和Swift的區(qū)別

Swift是蘋果最近新推出的一門語言但是他還不能起到代替OC的作用。OC之前積累的很多類庫,在Swift中大部分依然可以直接使用,當(dāng)然艇挨,Swift3之后浴韭,一些語法改變了很多剧辐,不過還是有跡可循的稀并。OC出現(xiàn)過的絕大多數(shù)概念昂拂,比如引用計數(shù)鞭缭、ARC剖膳、屬性、協(xié)議缚去、接口潮秘、初始化、擴(kuò)展類易结、命名參數(shù)枕荞、block等,在Swift中繼續(xù)有效(可能最多換個術(shù)語)搞动。Swift大多數(shù)概念與OC一樣躏精。當(dāng)然Swift也多出了一些新興概念,這些在OC中是沒有的鹦肿,比如范型矗烛、元組等。

Swift的優(yōu)勢 OC的劣勢

  1. Swift 語法和文件結(jié)構(gòu)簡易化。文件分離后結(jié)構(gòu)更清晰瞭吃。
  2. Swift更加安全碌嘀,它是類型安全的語言。
  3. Swift速度更快歪架,運(yùn)算性能更高股冗。
  4. 不像C語言和OC語言一樣都必須有一個主函數(shù)main()作為程序的入口, swift程序從第一句開始向下順序執(zhí)行, 一直到最后

Swift的劣勢 OC的優(yōu)勢

  1. 版本不穩(wěn)定,每次升級都報好多紅
  2. Runtime對Swift支持不太友好屏蔽了好多下層Api

Swift 處境

  1. 使用人數(shù)比例偏低和蚪,有好多資料查找較為困難
  2. 一些比較優(yōu)秀的第三方還是用OC寫的≈棺矗現(xiàn)在Swift也有不少
  3. 蘋果推出這門語言肯定會推廣只是時間問題。

Swift3.1 - Swift 5.0 版本的差異

推薦大家一個網(wǎng)站名字叫whats new in swift 攒霹,可以看各個版本的歷史差異

借鑒這位老哥的文章

Swift5.0

  1. 在字符串中包含 " 時不必再加 **,包含 \ 反斜杠也不需要再加轉(zhuǎn)義符.
 var t: String = "123"
 var p: String = #"123"t"12"#
 print(p)

123"t"12
  1. 由于反斜杠作為字符串中的字符怯疤,所以在插入值的時候需要在后面再加個 #
 //before
 let answer = 42
 let dontpanic = "The answer to life, the universe, and everything is \(answer)"
 // after
 let answer = 42
 let dontpanic = #"The answer to life, the universe, and everything is \#(answer)"#
  1. 當(dāng)字符串包含 # 時, 前后應(yīng)用 ## 包裹字符串
let str = ##"My dog said "woof"#gooddog"##
  1. 用 #""" 開頭 """#結(jié)尾 來表示多行字符串
let multiline =
  #"""
  The answer to life,
  the universe,
  and everything is \#(answer).
  """#
  1. 由于不用反斜杠轉(zhuǎn)義 使得正則表達(dá)式更加簡潔明了
 //before
 let regex1 = "\\\\[A-Z]+[A-Za-z]+\\.[a-z]+"
//after
 let regex2 = #"\\[A-Z]+[A-Za-z]+\.[a-z]+"#
  1. 在枚舉新增加一個 @unknown 修飾 default 分支,這樣使得將來 enum 再增加一個 case 的時候催束,編譯器會在該枚舉的switch 代碼里生成一個警告

  2. integers 新增加了一個 isMultiple(of:) 方法
    來檢測一個數(shù)是否是另一個數(shù)的倍數(shù)

  3. Sequence 新增加了一個方法 count(where:) 相當(dāng)于 filter() + count 的結(jié)果集峦,但是它更加簡潔一步到位

  4. 為字典新增了一個方法 compactMapValues(),正如數(shù)組的compactMap函數(shù)一樣,可以過濾nil,類型轉(zhuǎn)換

Swift4.2

  1. 枚舉里增加CaseIterable協(xié)議自動合成將只發(fā)生在不使用關(guān)聯(lián)值的枚舉中抠刺。

  2. #warning和 # error

  3. @dynamicMemberLookup 它指示 swift 在訪問屬性時調(diào)用下標(biāo)方法少梁。此下標(biāo)方法,subscript(dynamicMember:) 是必需的: 您將獲得所請求的屬性的字符串名稱, 并且可以返回您喜歡的任何值。

@dynamicMemberLookup
struct Person {
    subscript(dynamicMember member: String) -> String {
        let properties = ["name": "Taylor Swift", "city": "Nashville"]
        return properties[member, default: ""]
    }
}

@dynamicMemberLookup屬性需要類型來實現(xiàn)下subscript(dynamicMember:)方法來處理動態(tài)成員查找的實際工作矫付。正如您所看到的, 我已經(jīng)編寫了一個接受成員名稱為字符串并返回字符串的名稱, 在內(nèi)部它只是在字典中查找成員名稱并返回其值。

該結(jié)構(gòu)允許我們編寫如下所示的代碼:

let person = Person()
print(person.name)
print(person.city)
print(person.favoriteIceCream)
  1. 提供了一種新的allSatisfy()方法, 用于檢查序列中的所有項是否都通過條件第焰。
let scores = [85, 88, 95, 92]
let passed = scores.allSatisfy { $0 >= 85 }
  1. removeAll(where:)

Swift4.1

  1. Equatable" 協(xié)議 "允許 swift 將類型的一個實例與另一個實例進(jìn)行比較买优。當(dāng)我們說5 == 5時, swift 理解這意味著Int什么, 因為 ant 符合Equatable, 這意味著它實現(xiàn)了一個描述== Int的兩個實例 的函數(shù).
    在我們自己的值類型中實現(xiàn)Equatable"使它們能夠像 swift 的字符串、數(shù)組挺举、數(shù)字等一樣工作, 并且通常最好使結(jié)構(gòu)符合Equatable以便它們更好地符合值類型的概念
struct Person: Equatable {
    var firstName: String
    var lastName: String
    var age: Int
    var city: String

    static func ==(lhs: Person, rhs: Person) -> Bool {
        return lhs.firstName == rhs.firstName && lhs.lastName == rhs.lastName && lhs.age == rhs.age && lhs.city == rhs.city
    }
}

即使讀起來很累, 也別管寫了.
幸運(yùn)的是, Swift 4.1 可以合成公式Equatable的一致性–它可以自動生成==, 它將一個值中的所有屬性與另一個值中的所有屬性進(jìn)行比較, 就像上面一樣杀赢。所以, 現(xiàn)在你要做的就是為你的類型添加Equatable協(xié)議, 而 swift 將完成剩下的工作。
當(dāng)然, 如果你想, 你可以實現(xiàn) = ==自己湘纵。例如, 如果您的類型有一個唯一標(biāo)識它的id字段, 則可以編寫==比較該單個值, 而不是讓 swift 執(zhí)行所有額外的工作脂崔。
Swift 4.1 還引入了對Hashable的綜合支持, 這意味著它將自動為符合類型生成hashValuevalue 屬性。Hashable實現(xiàn)總是很煩人的, 因為你需要為每個對象返回一個唯一的 (或者至少是唯一的) 哈希梧喷。不過, 這一點很重要, 因為它允許您將對象用作字典鍵, 并將其存儲在集合中砌左。

Swift 4.0

  1. Swift 4 引入了一種新Codable, 允許您序列化和反序列化自定義數(shù)據(jù)類型, 而無需編寫任何特殊代碼, 而無需擔(dān)心丟失值類型。更好的是, 您可以選擇數(shù)據(jù)的序列化方式: 您可以使用經(jīng)典的屬性列表格式, 甚至可以使用 JSON 格式铺敌。

  2. 多行字符串文本 """ """ 可以直接聲名多行字符串文本

  3. Objit-c 最受歡迎的功能之一是它能夠動態(tài)地而不是直接引用屬性--也就是說, 可以說 "給定對象 X, 這里是我想讀的屬性", 而無需實際閱讀它汇歹。這些引用稱為關(guān)鍵路徑, 不同于直接屬性訪問, 因為它們實際上不讀取或?qū)懭胫? 它們只是將其隱藏起來供以后使用。 Swift最終使用的語法使用了反斜杠: \Starship.name. name, \Starship.maxWarp和\Starship.captain.name偿凭。您可以將這兩個變量分配給變量, 然后在任何 Starship 實例上Starship隨時使用它們

  1. 字符串變成集合類型

  2. Swift 4 可以將數(shù)組進(jìn)行切片,其中缺失的一側(cè)自動推斷為集合的開始或結(jié)束产弹。

let characters = ["Dr Horrible", "Captain Hammer", "Penny", "Bad Horse", "Moist"]
let bigParts = characters[..<3]
let smallParts = characters[3...]
print(bigParts)
print(smallParts)
  1. 改進(jìn)的字典功能 Swift3中在 Swift 3 中篩選詞典不會返回新詞典。相反, 它返回一個包含 key/值標(biāo)簽的元組數(shù)組弯囊。例如:
let cities = ["Shanghai": 24_256_800, "Karachi": 23_500_000, "Beijing": 21_516_000, "Seoul": 9_995_000];
let massiveCities = cities.filter { $0.value > 10_000_000 }

代碼運(yùn)行后, 您無法讀取massiveCities["Shanghai"] , 因為它不再是字典痰哨。相反, 你需要使用massiveCities[0].value, 這不是很好胶果。
從 Swift 4 開始, 這更像你所期望的那樣: 你能得到一本新字典。顯然, 這將破壞依賴于元組數(shù)組返回類型的任何現(xiàn)有代碼斤斧。

同樣, 字典上的map()沒有像許多人所希望的那樣有效: 您得到了一個傳入的鍵值元組, 并且可以返回要添加到數(shù)組中的單個值早抠。例如:

let populations = cities.map { $0.value * 2 }

在 Swift 4 中, 這種情況沒有改變, 但有一種名為mapValues()的新方法將更加有用, 因為它允許您轉(zhuǎn)換值并使用原始鍵將其放回字典中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末折欠,一起剝皮案震驚了整個濱河市贝或,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锐秦,老刑警劉巖咪奖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酱床,居然都是意外死亡羊赵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門扇谣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昧捷,“玉大人,你說我怎么就攤上這事罐寨∶一樱” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵鸯绿,是天一觀的道長跋破。 經(jīng)常有香客問我,道長瓶蝴,這世上最難降的妖魔是什么毒返? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮舷手,結(jié)果婚禮上拧簸,老公的妹妹穿的比我還像新娘。我一直安慰自己男窟,他們只是感情好盆赤,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蝎宇,像睡著了一般弟劲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姥芥,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天兔乞,我揣著相機(jī)與錄音,去河邊找鬼。 笑死庸追,一個胖子當(dāng)著我的面吹牛霍骄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淡溯,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼读整,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咱娶?” 一聲冷哼從身側(cè)響起米间,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膘侮,沒想到半個月后屈糊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡琼了,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年逻锐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雕薪。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡昧诱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出所袁,到底是詐尸還是另有隱情盏档,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布燥爷,位于F島的核電站妆丘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏局劲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一奶赠、第九天 我趴在偏房一處隱蔽的房頂上張望鱼填。 院中可真熱鬧,春花似錦毅戈、人聲如沸苹丸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赘理。三九已至,卻和暖如春扇单,著一層夾襖步出監(jiān)牢的瞬間商模,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留施流,地道東北人响疚。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像瞪醋,于是被迫代替她去往敵國和親忿晕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355