[WWDC] What's New in Swift 4 ?
前言
本文主要是笔者小结 WWDC2017 中 《What's New in Swift》的 Session ,其中也掺杂了些《What’s New in Foundation》,仅作记录。
下面步入主题。
私有访问控制("Private" Access Control)
SE-0169
在 Swift 4 中,private 修饰的属性可以在 Extension 中访问了,再也不要用 fileprivate 修饰属性了?。
下面我们来区分 Swift 3 与 Swift 4 中的区别。
Swift 3:
Swift 4:
类与协议(Class and Subtype Existentials)
SE-0156
在 Swift 3 中,有些童鞋使用代理时,无法同时继承类和协议
Swift 4 中,针对此处进行了改进,直接上 WWDC17 示例代码:
func shareEm(control: UIControl & Shakeable) {control.share()
}protocol Shakeable {func share()
}extension Shakeable {func share() {print("starting share!")}
}extension UIButton: Shakeable { }extension UISlider: Shakeable { }
Smart KeyPaths
SE-0161
在 Swift 4 中新增了一种 Key-Path 表达式,该表达式可用于 KVC & KVO 中的 APIs,格式如下:
\[Type Name].[Property Name]
示例代码如下:
struct SomeStructure {var someProperty: Int
}func smartKeyPath() {let s = SomeStructure(someProperty: 12)let keyPath = \SomeStructure.somePropertylet value = s[keyPath: keyPath]print(value)// value is 12
}
如果在上下文中,能隐含的推断出其类型,那么 Key-Path 表达式中的 Type Name 可以省略,即
\.[Property Name]
如:
@objcMembers class SomeClass: NSObject {dynamic var someProperty: Intinit(someProperty: Int) {self.someProperty = someProperty}
}var observe: NSKeyValueObservation?
let c = SomeClass(someProperty: 10)func smarkKVO() {observe = c.observe(\.someProperty) { object, change in// ...print(object.someProperty, change)}c.someProperty = 10
}
Archival & Serialization
SE-0166
Excerpt From: Apple Inc. “Using Swift with Cocoa and Objective-C (Swift 4 beta).
我们以下面这段 JSON 为例,来看 Swift 4 中针对 JSON 进行解析的新方法
{"name": "Banana","points": 200,"description": "A banana grown in Ecuador.","varieties": ["yellow","green","brown"]
}
首先,我们要遵循 Codable 协议:
struct GroceryProduct: Codable {let name: Stringlet points: Intlet description: Stringlet varieties: [String]
}
使用 JSONDecoder 进行解析:
let json = """{"name": "Banana","points": 200,"description": "A banana grown in Ecuador.","varieties": ["yellow","green","brown"]}
""".data(using: .utf8)!let decoder = JSONDecoder()
let banana = try! decoder.decode(GroceryProduct.self, from: json)print("\(banana.name) (\(banana.points) points): \(banana.description)")
// Prints "Banana (200 points): A banana grown in Ecuador.
Encoders
SE-0167
本节主要展示 JSONEncoder 编码,直接上代码:
struct University: Codable {enum Level: String, Codable {case one, two, three}var name: Stringvar founds: Intvar type: Level
}func codableTest (_ obj: University) {let encoder = JSONEncoder()let decoder = JSONDecoder()guard let data = try? encoder.encode(obj) else { return }guard let jsonData = try? decoder.decode(University.self, from: data) else { return }print("jsonData:", jsonData)
}
关于字符串(String)
字形群集(Grapheme Cluster)
在 Swift 4 中,修复了字形群集长度计算的一些问题,如 emoji 表情。关于字形群集或者 Unicode 编码概念生疏的童鞋可以看笔者之前写的两篇文章 《字符编码(一)》、《Swift3.0 中 Strings/Characters 闲聊》。下面我们来看看 WWDC17 上的的示例:
var family = "?"
family += "\u{200D}?"
family += "\u{200D}?"
family += "\u{200D}?"print("\(family):\(family.count)")
// result --> ????:1
在之前 family.count 会等于 4(u{200D} 是一个零宽度的 joiner)。
笔者在 Xcode 9 beta1 上运行,选择 Swift 编译语言版本时,测试结果无效,只有在 Xcode 8 测试时 family.count = 4。
字符串改版(String Revision)
SE-0163
在 Swift 2 中,String 的集合这一特性被遗弃,在 Swift 3 中,String 也没有遵守集合的相关协议(如:RangeReplaceableCollection, BidirectionalCollection),因此自 Swift 2 起,String 不是一个集合,而是把这一特性赋予给了 String 的一个属性 --> characters (A view of the string’s contents as a collection of characters.),该属性是 String.CharacterView 类型,并且遵守 RangeReplaceableCollection 协议。
extension String.CharacterView : RangeReplaceableCollection {···}
因此我们在遍历或者操作 String 时,经常会这么写:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 3.1).” iBooks. https://itunes.apple.com/us/b...
for character in "Dog!?".characters {print(character)
}
// D
// o
// g
// !
// ?
.characters.····。
但,直至 Swift 4,String 又开始遵循集合相关协议,从此可以这么写了:
for character in "Dog!?" {print(character)
}
// D
// o
// g
// !
// ?
当然在 Swift 4 中又出现了一个新的结构体 Substring,Substring 无法直接赋值给 String 的。
关于 Substring 与 String 之间的转换可以这么写:
let label = UILabel()
let superStr = "tingxins"
let subStr = superStr.prefix(4)
label.text = String(subStr)
print(subStr)
字符串跨行写法(Multi-Line String Literals)
SE-0168
如果字符串需要跨多行,可以这么写:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).”.
let quotation = """
The White Rabbit put on his spectacles.
"Where shall I begin, please your Majesty?" he asked."Begin at the beginning," the King said gravely, "and go on
till you come to the end; then stop."
"""
没错,三对引号。
如果字符串本身包含三个连续的 ‘"""‘ 引号时,可以采用反斜杠进行转义处理(),如:
let threeDoubleQuotes = """
Escaping the first quote \"""
Escaping all three quotes \"\"\"
"""
单面区间语法(One-Sided Ranges)
SE-0172
在 Swift 3 中,区间运算符只有两种:闭区间运算符(Closed Range Operator)、半闭区间运算符(Half-Open Range Operator)。在 Swift 4 中,又新增了一种更加简单方便的区间运算符-->单面区间(One-Sided Ranges)。
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).
你可以这样写:
let names = ["Anna", "Alex", "Brian", "Jack"]for name in names[2...] {print(name)
}
// Brian
// Jackfor name in names[...2] {print(name)
}
// Anna
// Alex
// Brian
当然也和结合半闭区间运算符,可以这么写:
for name in names[..<2] {print(name)
}
// Anna
// Alex
判断区间是否包含,可以这么写:(for语句中要注意死循环哈)
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true”
WWDC17 示例代码:
序列协议(Sequence)
SE-0142
在 Swift 3 中,假设我们要为 Sequence 扩展一个方法,要这么写:
extension Sequence where Iterator.Element: Equatable {func containsOnly(_ value: Iterator.Element) -> Bool {return contains { (element) -> Bool inreturn element == value}}
}
但在 Swift 4 中, 针对 Sequence 做了一些小改进,使我们代码更加轻便,看起来更加清爽:
extension Sequence where Element: Equatable {func containsOnly(_ value: Element) -> Bool {return contains { (element) -> Bool inreturn element == value}}
}
这是怎么实现的呢?因为在 Swift 4 中,我们在声明一个 associatedtype 的 placeholder 时,我们可以使用 where 语句了。
下面我们来对比一下 Swift 3 与 Swift 4 中 Sequence 的区别:
在 Swift 3 中 Sequence 协议是这么写的:
在 Swift 4 中进行改进后,是这么写的:
对比看完后,想必读者一目了然。
下面针对 associatedtype 中使用 where 语句,我们再来看个例子:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).
protocol Container {associatedtype Itemmutating func append(_ item: Item)var count: Int { get }subscript(i: Int) -> Item { get }associatedtype Iterator: IteratorProtocol where Iterator.Element == Itemfunc makeIterator() -> Iterator
}
如果在 Swift 3 下写,Xcode 会出现这样的编译错误:
有了上面这些特性后,我们在使用 Swift 4 时,可以省略一些冗余约束,这里直接上 WWDC17 的示例代码:
在 Swift 3 中,是这样写的:
在 Swift 4 中,现在我们可以这么写:
泛型下标(Generic Subscripts)
SE-0148
在 Swift 4 中,现在支持泛型下标了,直接上代码:
Excerpt From: Apple Inc. “The Swift Programming Language (Swift 4).
extension Container {subscript<Indices: Sequence>(indices: Indices) -> [Item]where Indices.Iterator.Element == Int {var result = [Item]()for index in indices {result.append(self[index])}return result}
}
上述代码我们为 Container 添加了下标取值能力,在这个泛型下标中有 3 个约束:
泛型参数 Indices 遵守 Sequence 协议
indices 是 Indices 类型的一个实例
泛型 where 语句筛选 Indices.Iterator.Element 为 Int 类型
关于整型(Protocol-oriented integers)
SE-0104
字典与集合(Dictionary & Set enhancements)
SE-0165
Number 对象桥接(NSNumber bridging and Numeric types)
SE-0170
Swift 3 中,NSNumber 转换有个 Bug,如:
let n = NSNumber(value: UInt32(543))
let v = n as? Int8
// v is 31
Swift 4 中已修复:
可变集合(MutableCollection)
SE-0173
现在可变集合增加了一个方法,我们可以直接使用 swapAt 方法,而非 swap 。
let university0 = University(name: "Qsting", founds: 1870, type: .one)
let university1 = University(name: "tingxins", founds: 1870, type: .one)
var mutableCollection = [university0, university1]print(mutableCollection)
mutableCollection.swapAt(0, 1) //交换数组中0、1元素的位置
print(mutableCollection)
Change filter to return Self for RangeReplaceableCollection
SE-0174
参考链接
https://developer.apple.com/v...
https://github.com/apple/swif...
https://github.com/ole/whats-...
https://developer.apple.com/l...
https://developer.apple.com/l...
广告
欢迎关注微信公众号
[WWDC] What's New in Swift 4 ?相关推荐
- 观点:再见Objective C?程序员眼中的Swift
对于苹果开发者来说,如今已经进入了"Swift时代".虽然编程语言Objective C备受喜爱,不过它作为苹果主流编程语言的日子已经所剩无几.随着WWDC开发者大会的落幕,Swi ...
- 如何使用Swift Playgrounds制作东西
by Harshita Arora 通过Harshita Arora 如何使用Swift Playgrounds制作东西 (How to make something with Swift Playg ...
- 苹果编程语言Swift中文教程:Swift简介
这篇文章简要介绍了苹果于WWDC 2014发布的编程语言--Swift. Swift是什么? Swift是苹果于WWDC 2014发布的编程语言,这里引用The Swift Programming L ...
- 【沙龙干货】Swift是花拳绣腿吗?开发语言与职业生涯如何选择?
腾讯Bugly移动开发者沙龙 第二期:快速发展的Swift是否将淘汰Objective-C? [分享内容]Swift是花拳绣腿?–开发语言与职业生涯的选择 随着WWDC 2015的举行,Swift 2 ...
- 1、swift开发iOS——基础
swift开发iphone app SWIFT Swift 是一种支持多编程范式和编译式的开源编程语言,苹果于2014年WWDC(苹果开发者大会)发布,用于开发 iOS,OS X 和 watchOS ...
- Swift 代码调试核武-LLDB调试基础
原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow 前言:LLDB是个开源的调试器,与XCode绑定 ...
- Swift 现可使用 Checkmarx 检查代码出错
自从2014年在苹果的WWDC上发布后,Swift 引起了许多人的注意,至今也已拥有不少使用者.谷歌甚至有在考虑将 Swift 列入安卓的"第一类"语言中.Facebook 和 U ...
- 来自苹果的编程语言——Swift简介
这篇文章简要介绍了苹果于WWDC 2014发布的编程语言Swift. 原文作者: Lucida Blog 新浪微博 豆瓣 前言 在这里我认为有必要提一下Brec Victor的Inventing on ...
- 【转载】来自苹果的编程语言——Swift简介
本文转自Lucida的博客 (新浪微博.豆瓣) 这篇文章简要介绍了苹果于WWDC 2014发布的编程语言--Swift. 前言 在这里我认为有必要提一下Brec Victor的Inventing on ...
最新文章
- TRzCheckTree的使用
- Awk使用案例总结(运维必会)
- 大数据架构如何做到流批一体?
- 游戏开发者需要注意的4个内存使用问题
- 0419 一些不错的UI作品,以后陆续更新
- KVM 虚拟机自动克隆脚本
- 使用Hibernate批量获取
- 20191219算法题存档
- python取出矩阵中的某一元素_将tensorflow.Variable中的某些元素取出组成一个新的矩阵示例...
- C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集...
- css3中定义required,focus,valid和invalid样式
- 00.Maven简介
- Keli Linux与网络安全(2)——初探Keli
- C语言题目:新胖子公式 (10 分)
- C++异常类型以及多级catch匹配
- 包含tsx的react项目创建
- 温泉PHP网络授权系统,温泉PHP授权系统验证系统完整开源
- Codeforces Round #727 (Div. 2) B. Love Song
- Poseidon(海神号)
- 电路小知识之“GND”
热门文章
- php v9 ajax 翻页,php ajax 无刷新翻页实现代码
- 简单的java rpc_Java 简单的rpc 一
- linux能修复根目录硬盘,Linux系统报错修复的方法
- git rollback代码都没了_Git使用总结
- php.ini centos,CentOS下修改php.ini后不生效的方法
- 2021年春季学期-信号与系统-第八次作业参考答案-第六小题
- ADuC845串口下载模块制作
- 第十五届智能车竞赛不公平竞争情况反映以及审议结果
- php dir opendir,php opendir()列出目录下文件的方法代码
- loadrunner使用流程_LoadRunner关联函数