1.swift4可以通过default
从字典中取一个非空的值(数组没有类似的属性)
let value = starWordsCount[starName, default: 0] //从字典中取值并赋默认值
2.可以使用如下的方式定义一个多行的字符串, 字符串中包含换行符号, 但是不包含每行开始的空格.
let str = """ abcdefg highlmn """print(str)
3.swift4中, extension中可以访问private属性. extension中不能重写父类的方法, 写在extension中的方法不能被子类重写.
4.Codable协议
在Objective-C中值类型的相互影响是十分糟糕的。比如NSCoding协议,类继承它之后,我们需要在类中重写自定义的 encoding 和 decoding方法。这样显得十分痛苦而且很容易出错。
在swift4.0 中,引入了新的Codable协议,可以让你在不添加其他特殊代码的情况下序列化和反序列化自定义的数据类型,从而不用担心值类型的丢失。更漂亮的是,你可以选择数据被序列化为什么样的格式:plist(XML)或者JSON。
是的,Swift 4 可以让你在不添加任何特殊代码的情况下将自定义数据类型序列化为JSON。
struct Language:Codable { var name: String var version: Int}let swift = Language(name:"Swift",version:4)let encoder = JSONEncoder()let encoded = try? encoder.encode(swift){ //...}
5.String又变成了集合类型
就是说, 可以做字符串倒置, 获取每个字符, map(), flatMap()等高阶函数.
6.在Swift4中一个对象的属性可以遵守多个协议,用&组合
var delegate: Protocol1 & Protocol2
7.Associated Type可以追加Where约束语句
associatedtype Element where//swift4标准库代码如下, 它限定了 Sequence 中 Element 这个类型必须和 Iterator.Element 的类型一致。protocol Sequence { associatedtype Element where Self.Element == Self.Iterator.Element // ...}
8.Unicode 字符串在计算 count 时的正确性改善
9.更快的字符处理速度
Swift 4 的字符串优化了底层实现,对于英语、法语、德语、西班牙语的处理速度提高了 3.5 倍。 对于简体中文、日语的处理速度提高了 2.5 倍。
10.移除未调用的协议实现
如果某个类实现了某个协议, 怎如果编译器编译时候发现没有任何地方调动协议相关的方法, 则编译器会移除掉协议实现相关内容, 来达到见笑包大小的目的.
11.减少隐式@objc自动推断
在项目中想把swift写的api暴露给oc调用, 需要增加@objc
, 在swift中, 编译器会在很多地方为我们隐式的加上, 例如当一个类继承自NSObject, 那么这个类所有方法都会被隐式的加上@objc.
这样很多并不需要暴露给objc的代码也被加上了@objc. 大量@objc会导致二进制问价大小的增加.
在swift4中, 隐式@objc自动推断只会发生在很少的必须使用@objc的情况下, 比如: 重写父类objc协议; 遵守一个objc协议. 其它大多数地方必须手工的显示的加上@objc
. 减少了隐式@objc自动推断后, Apple Music app的包大小减少了5.7%.