Swift 4 新功能详解 《What's New in Swift》

简介:

Swift 4来袭,这次升级来说好的很多,大部分都是介于Swift 3的基础上附加的,基本语法是没有什么大的变化的.想想Swift2-Swift3的变化,那一段蛋疼的时间.Swift 4的这次更新,真的爽太多了

Swift 4需要安装Xcode 9--->下载链接 Xcode 9同时支持Swift 3\Swift 4,你的项目中的Target可以是Swift 3.2或Swift 4,当想迁移到Swift 4时,你可以通过Edit/Convert/To Current Swift Syntax…来打开转换工具。

新特性:

1.开区间

 SE-0172带来 种新的RangeExpression协议和 组前缀/后缀操作符给开区间.比如现在区间论是上界还是下界都可以不指定

Swift 3的写法----->

Swift 3’s solution to this is a family of methods:

let greeting = s.prefix(upTo: i)

let withComma = s.prefix(through: i)

let location = s.suffix(from: i)

Swift 4的写法----->

let greeting=s[...<i]

let withComma=s[...i]

letlocation=s[i...]

2.字符串Strings的变化 

a.SE-0168大佬带来一种种简洁定义多字符的语法,使("""),在多行字符串中并不需要写转译字符,也就是说大多数文本格式(入JSON或HTML)就可以直接粘贴而无需任何转译,结尾三引号的缩进觉定每一行的头部空格的多少,哈哈说到这个Python笑了"呵呵"Kotlin"我也早有了"

b.SE-0163是的,Swift 4字符串模型的第一部分修正,好像艾克的大招一样回光反照了,String又变得像以前的Swift 1.x一样了,此次更改String中的.CharacterView,并在了其父类中,其他view,UnicodeScalarView, UTF8View,和UTF16View,依旧还在.

去掉了String的characters数组,可以直接用数组的方式来遍历String对象:

let yourString = "Hello world"

for char in yourString{

     print(char)

}

c.添加新类型字符串切片是SubString类型的实例,两者都遵循StringProtocol,所以说对应API来说String和Substring行为很大程度相同

let endIndex = sample.index(sample.startIndex ,offsetBy:3)

var subString =  sample[sample.startIndex...endIndex]

d.支持Unicode 9,之前,由多个代码点组成的Unicode字符引起大于1的计数,下面的字符计数都是1,前后对比

"👩‍💻".count // Now: 1, Before: 2

"👍🏽".count // Now: 1, Before: 2

"👨‍❤️‍💋‍👨".count // Now: 1, Before, 4

现在可以直接访问一个Character的unicode编码值,不用先转成String SE-0178,如下:

For example, today you can write this:

lets="one two three"s.split(separator:"")

But you cannot write this:

let ws=CharacterSet.whitespacesAndNewliness

split{ $0.unicodeScalars.contains(where: ws.contains)  }

4.Private访问修饰符

SE-0169同文件内的扩展,私有声明可见,Swift 3 private成员本身私有使用,fileprivate则是在同一个文件被共享访问成员时使用,原类型的private声明也是可见的.这种改进可让同文件内保持使private分割类型定义成为可能,减少不受欢迎的fileprivate关键词的使用

Swift 3:

struct Outer {

     private var outerValue = 42

     struct Inner {

            private var innerValue = 57

            func innerTest(_o:  Outer)  {

                   print(o.outerValue)       //still ok.

           }   

 }func test(_i: Inner) {

         print(i.innerValue)          //still an error

  }

}

but Swift 4

struct SortedArray {

     private var storage: [Element] = []init(unsorted: [Element]) {

            storage = unsorted.sorted()

     }

}

extension SortedArray {

     mutating func insert(_ element: Element) {

           storage    此处可见

           storage.append(element)

          storage.sort()

    }

}

5.key path

class dog: NSObject {

      @objc var dogName = "阿黄"

}

//swift4之前

//let dog = dog()

//dog.dogName = "阿黄"

//var name = dog.value(forKeyPath:  "dogName")

//dog("老王", forKeyPath: "dogName")

/// Swift4.0

//let dogKeyPath = dog.season

//var dogName = dog[keyPath: dogKeyPath]

//dog[keyPath: dogKeyPath] = "老王"

6.压缩化与序列化

Swift Archival & Serialization定义  种为任意Swift类型(class, struct,和enum)来描述如何压缩和序列化的方法.类型可遵从Codable协议让自身可(解)压缩.多数情况下添加Codable协议就可以让你的自定义类型完美解压缩,因为编译器可以生成一个默认的实现,前提是所有成员类型都是Codable的.当然你可以覆盖默认方法如果需要优化自定义类型的编码.SE-0166

7.使用泛型下标操作符

SE-0148,下标现在可以有泛型参数和返回类型

struct JSON {

private var data: [String: Any]

init(data: [String: Any]) {

self.data = data

}

subscript(key: String) -> Any? {

return data[key]

}

}

let json = JSON(data: [

"name": "老万",

"age": 2

])

let name: String? = json["name"] as? String  // "老万"

let age: Int? = json["age"] as? Int          // 2





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

推荐阅读更多精彩内容