加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift 4正式发布,新功能概览

发布时间:2020-12-14 05:13:18 所属栏目:百科 来源:网络整理
导读:Swift最新的主要版本提供了针对语言本身以及标准库的大量改动和更新,最重要的变化包括新增的String功能、扩展集合、归档和序列化等。 Swift 4中,String已全面遵循Collection协议,因此可直接迭代并提供了集合与序列类似的全部条件,例如: for c in myStri


Swift最新的主要版本提供了针对语言本身以及标准库的大量改动和更新,最重要的变化包括新增的String功能、扩展集合、归档和序列化等。


Swift 4中,String已全面遵循Collection协议,因此可直接迭代并提供了集合与序列类似的全部条件,例如:

for c in myString {
 ?print(c)
}
myString.filter { c in
 ?return boolCheck(c)
}
let l = myString.count
let myString2 = myString.dropFirst()

此外String切片现已成为下标(Substring)类型的实例,遵循StringProtocol,可按照与String类型完全一致的方式使用。


这一改动有助于改善切片性能,因为Substring已经不再需要复制Stri作可ng切片。复制操延迟至Substring转换为String并被某些API使用的时候进行。


String的其他功能还包括:支持Unicode 9以及多行Literal。


Swift 4还改进了用户创建、使用和管理集合类型的方式,例如Dictionary和Set。


首先,用户现在已经可以通过元祖(Tuple)序列创建字典,并指定如果遇到重复内容后的处理方式,而这一操作可在创建字典或合并两个字典的过程中进行:

let items = ["ItemA","ItemB","ItemC","ItemA"]
let prices = [14.40,41.63,3.71,15.63]
let catalog1 = Dictionary(uniqueKeysWithValues: zip(items,prices))
let catalog2 = Dictionary(prices,uniquingKeysWith: { (l,r) in
 ? ?l })
let catalog3 = Dictionary(prices,r) in
 ? ?l + r })
let merged = catalog.merge(catalog3) { (l,r) in r }

Dictionary和Set现在可以筛选成为原始类型的另一个对象,而不再筛选为Array。此外字典也已经可以支持新的mapValues方法:

let catalog4 = catalog.filter { $0.value < 15.0 }
let catalog5 = catalog.mapValues { $0 * 1.2 }

关于字典还有一个实用的改进:在访问其元素时可以指定默认值,这样便可让下标运算符返回Non-opt类型:

let price1 : Float = catalog['none',default: 0.0]
let price2 : Float? = catalog['none']

Swift 4中所有Collection类型均支持泛型下标(Generic subscript)。这意味着我们可以定义下列JSON结构,不将索引的结果抛给字典:

struct JSON {
 ? ?init(dictionary: [String:Any]) {
 ? ?...
 ? ?}
 ? ?subscript(key: String) -> T? {
 ? ?...
 ? ?}
}
let json = ...
let result: String? = json['item']

对于该语言还有一个广受好评的改进:对归档和序列化的支持,以前这需要通过NSObject和NSCoding处理,无法用于struct和enum类型。


但Swift 4通过Codable协议增加了对所有类型的序列化支持。Ole Begemann对Swift 4的编码和解码提供了入门简介。例如我们可以这样定义一个Codable类型:

struct Card: Codable,Equatable {
 ? ?enum Suit: String,Codable {
 ? ? ? ?case clubs,spades,hearts,diamonds
 ? ?}
 ? ?enum Rank: Int,Codable {
 ? ? ? ?case two = 2,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace
 ? ?}
 ? ?var suit: Suit
 ? ?var rank: Rank
 ? ?static func ==(lhs: Card,rhs: Card) -> Bool {
 ? ? ? ?return lhs.suit == rhs.suit && lhs.rank == rhs.rank
 ? ?}
}
let hand = [Card(suit: .clubs,rank: .ace),Card(suit: .hearts,rank: .queen)]

最后,Swift 4提供了两种语言模式,可通过-swift-version编译器选项进行选择。在Swift 3.2模式中,编译器可接受大部分使用Swift 3.x编译器编译的源代码。

在该模式下,大部分Swift 4语言功能均可用,但针对之前已有API的各种更新均不可用。在Swift 4.0模式中,我们可以使用Swift 4的全部功能,但可能需要改动部分源代码,这一过程通常可通过Xcode的迁移助理实现。


Swift 4还有很多改进,建议阅读Swift维护者Ted Kremenek的公告,并通过Ole Begemann在交互式Playground中提供的所有新功能演示来体验。


Swift 4已包含在Xcode 9中,并可手工安装到Xcode 8.3中使用。



更多精彩,请点击:

1. 实战:从零开始打造一个 Swift 网络框架

2. 伍星:拥抱 Swift 吧,骚年!

3. 提升认知,虚实并举|优才创智CEO伍星在开班仪式上的 6 点分享


如您有任何问题,请联系优才小编:

15201480058

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读