浅谈OC和Swift的区别

本文介绍两部分
Objcetive-c和Swift的区别
Swift3.x - Swift5.x的差异

OC和Swift的区别

Swift是苹果最近新推出的一门语言但是他还不能起到代替OC的作用。OC之前积累的很多类库,在Swift中大部分依然可以直接使用,当然,Swift3之后,一些语法改变了很多,不过还是有迹可循的。OC出现过的绝大多数概念,比如引用计数、ARC、属性、协议、接口、初始化、扩展类、命名参数、block等,在Swift中继续有效(可能最多换个术语)。Swift大多数概念与OC一样。当然Swift也多出了一些新兴概念,这些在OC中是没有的,比如范型、元组等。

Swift的优势 OC的劣势

  1. Swift 语法和文件结构简易化。文件分离后结构更清晰。
  2. Swift更加安全,它是类型安全的语言。
  3. Swift速度更快,运算性能更高。
  4. 不像C语言和OC语言一样都必须有一个主函数main()作为程序的入口, swift程序从第一句开始向下顺序执行, 一直到最后

Swift的劣势 OC的优势

  1. 版本不稳定,每次升级都报好多红
  2. Runtime对Swift支持不太友好屏蔽了好多下层Api

Swift 处境

  1. 使用人数比例偏低,有好多资料查找较为困难
  2. 一些比较优秀的第三方还是用OC写的。现在Swift也有不少
  3. 苹果推出这门语言肯定会推广只是时间问题。

Swift3.1 - Swift 5.0 版本的差异

推荐大家一个网站名字叫whats new in swift ,可以看各个版本的历史差异

借鉴这位老哥的文章

Swift5.0

  1. 在字符串中包含 " 时不必再加 **,包含 \ 反斜杠也不需要再加转义符.
 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. 当字符串包含 # 时, 前后应用 ## 包裹字符串
let str = ##"My dog said "woof"#gooddog"##
  1. 用 #""" 开头 """#结尾 来表示多行字符串
let multiline =
  #"""
  The answer to life,
  the universe,
  and everything is \#(answer).
  """#
  1. 由于不用反斜杠转义 使得正则表达式更加简洁明了
 //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:) 方法
    来检测一个数是否是另一个数的倍数

  3. Sequence 新增加了一个方法 count(where:) 相当于 filter() + count 的结果,但是它更加简洁一步到位

  4. 为字典新增了一个方法 compactMapValues(),正如数组的compactMap函数一样,可以过滤nil,类型转换

Swift4.2

  1. 枚举里增加CaseIterable协议自动合成将只发生在不使用关联值的枚举中。

  2. #warning和 # error

  3. @dynamicMemberLookup 它指示 swift 在访问属性时调用下标方法。此下标方法,subscript(dynamicMember:) 是必需的: 您将获得所请求的属性的字符串名称, 并且可以返回您喜欢的任何值。

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

@dynamicMemberLookup属性需要类型来实现下subscript(dynamicMember:)方法来处理动态成员查找的实际工作。正如您所看到的, 我已经编写了一个接受成员名称为字符串并返回字符串的名称, 在内部它只是在字典中查找成员名称并返回其值。

该结构允许我们编写如下所示的代码:

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" 协议 "允许 swift 将类型的一个实例与另一个实例进行比较。当我们说5 == 5时, swift 理解这意味着Int什么, 因为 ant 符合Equatable, 这意味着它实现了一个描述== Int的两个实例 的函数.
    在我们自己的值类型中实现Equatable"使它们能够像 swift 的字符串、数组、数字等一样工作, 并且通常最好使结构符合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
    }
}

即使读起来很累, 也别管写了.
幸运的是, Swift 4.1 可以合成公式Equatable的一致性–它可以自动生成==, 它将一个值中的所有属性与另一个值中的所有属性进行比较, 就像上面一样。所以, 现在你要做的就是为你的类型添加Equatable协议, 而 swift 将完成剩下的工作。
当然, 如果你想, 你可以实现 = ==自己。例如, 如果您的类型有一个唯一标识它的id字段, 则可以编写==比较该单个值, 而不是让 swift 执行所有额外的工作。
Swift 4.1 还引入了对Hashable的综合支持, 这意味着它将自动为符合类型生成hashValuevalue 属性。Hashable实现总是很烦人的, 因为你需要为每个对象返回一个唯一的 (或者至少是唯一的) 哈希。不过, 这一点很重要, 因为它允许您将对象用作字典键, 并将其存储在集合中。

Swift 4.0

  1. Swift 4 引入了一种新Codable, 允许您序列化和反序列化自定义数据类型, 而无需编写任何特殊代码, 而无需担心丢失值类型。更好的是, 您可以选择数据的序列化方式: 您可以使用经典的属性列表格式, 甚至可以使用 JSON 格式。

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

  3. Objit-c 最受欢迎的功能之一是它能够动态地而不是直接引用属性--也就是说, 可以说 "给定对象 X, 这里是我想读的属性", 而无需实际阅读它。这些引用称为关键路径, 不同于直接属性访问, 因为它们实际上不读取或写入值, 它们只是将其隐藏起来供以后使用。 Swift最终使用的语法使用了反斜杠: \Starship.name. name, \Starship.maxWarp和\Starship.captain.name。您可以将这两个变量分配给变量, 然后在任何 Starship 实例上Starship随时使用它们

  1. 字符串变成集合类型

  2. Swift 4 可以将数组进行切片,其中缺失的一侧自动推断为集合的开始或结束。

let characters = ["Dr Horrible", "Captain Hammer", "Penny", "Bad Horse", "Moist"]
let bigParts = characters[..<3]
let smallParts = characters[3...]
print(bigParts)
print(smallParts)
  1. 改进的字典功能 Swift3中在 Swift 3 中筛选词典不会返回新词典。相反, 它返回一个包含 key/值标签的元组数组。例如:
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 }

代码运行后, 您无法读取massiveCities["Shanghai"] , 因为它不再是字典。相反, 你需要使用massiveCities[0].value, 这不是很好。
从 Swift 4 开始, 这更像你所期望的那样: 你能得到一本新字典。显然, 这将破坏依赖于元组数组返回类型的任何现有代码。

同样, 字典上的map()没有像许多人所希望的那样有效: 您得到了一个传入的键值元组, 并且可以返回要添加到数组中的单个值。例如:

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

在 Swift 4 中, 这种情况没有改变, 但有一种名为mapValues()的新方法将更加有用, 因为它允许您转换值并使用原始键将其放回字典中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355