Swift 5 新特性
2020-04-06 本文已影响0人
uniapp
2019 年,苹果公布了新的 Swift5, 在开发官网明确提出了 Swift5 新增的 5 大功能],包括:
1 字符串采用 UTF-8 编码重新实施,这通常可以加快代码运行速度
2 默认情况下,独占访问内存功能在调试和发布版本上强制执行
3 标准资料库中的 SIMD Vector 和 Result 类型
4 Dictionary 和 Set 的性能得到了提升
5 支持可动态调用的类型,改善了与动态语言 (如 Python、JavaScript 和 Ruby) 的互操作性
对特性2 的理解:独占访问功能保证了数据操作的安全性,在调试版本上开启,保证运行时的一致;
对特性3 的理解:添加了新协议AdditiveArithmetic,提交Vector类型的运行效率;添加了枚举 Result,使用关联值接收返回数据,可以用在网络请求中;
其他 3 个特性,可以通过以下代码理解:
特性1
//MARK: 1 字符串采用 UTF-8 编码重新实施,这通常可以加快代码运行速度
func line_cal1() {
//MARK: / 的处理
let str_line = #"Sam: "How do U do?""#
print(str_line)
//Sam: "How do U do?"
//MARK: # 的处理
let str_line_2 = ##"Sam: "How do U do?" I use #swift"##
print(str_line_2)
//Sam: "How do U do?" I use #swift
//MARK: 使用正则
let mathch1 = #"[0-9]\s[0-9]"#
let regular = try! NSRegularExpression(pattern: mathch1, options: .allowCommentsAndWhitespace)
let str = "123 256 345 789"
let res = regular.matches(in: str, options: .withoutAnchoringBounds, range: NSRange(location: 0, length: str.count))
res.forEach { (res) in
let start = str.index(str.startIndex, offsetBy: res.range.location)
let end = str.index(start, offsetBy: res.range.length)
let subStr = str[start..<end]
print(subStr)
/**
3 2
6 3
5 7
*/
}
}
特性4
//MARK: 4 处理字典值,组成新字典,并且去掉不符合条件item
func map_dic() {
let a = ["a":"2", "b":"1", "c":"c"]
let res = a.compactMapValues({Int($0)})
//["a": 2, "b": 1]
}
特性5
//MARK: 5 dynamicCallable 一级对象默认接口
func dyna() {
struct RandomGenerato {
func generate(powerNum: Int) -> Double {
let max = pow(10, Double(powerNum))
return Double.random(in: 0...max)
}
}
@dynamicCallable
struct RandomGenerato2 {
func dynamicallyCall(withArguments args:[Int]) -> Double {
print(args)
let powerNum = Double(args.first ?? 0)
let max = pow(10, Double(powerNum))
return Double.random(in: 0...max)
}
}
@dynamicCallable
struct RandomGenerato3 {
func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, String>){
for (key, value) in withKeywordArguments {
print("\(key) --- \(value)")
}
}
}
let generator2 = RandomGenerato2()
let res = generator2(1,2,3)
print(res)
let generator3 = RandomGenerato3()
generator3(name:"zhangsan")
}
Swift5 中其他新增功能
//MARK: 1 是否是某个数的整数倍
func num_1() {
let num1 = 4
if num1.isMultiple(of: 1) {
print("even")
}
}
//MARK: 2 enum的模式匹配
func enum_mode() {
enum Sex {
case man(height: [Int])
}
func getSex() -> Sex {
return .man(height: [165,166,170,180])
}
let m1 = getSex()
if case let Sex.man(height: h) = m1 {
print(h)
}
}
//MARK: 2 keyPath 读、写属性值
func keyPath() {
class Person: NSObject {
var name : String?
var contact : [Person] = []
init(_ name:String) {
super.init()
self.name = name
}
}
let p1 = Person("小明")
let p2 = Person("小红")
p1.contact.append(p2)
let namePath = \Person.name
print(p1[keyPath:namePath])
let wKeyPath = \Person.contact[0].name
print(p1[keyPath: wKeyPath]!)
class Person2: NSObject {
@objc var name : String?
init(_ name:String) {
super.init()
self.name = name
}
}
let p3 = Person2("小明")
let name2 = p3.value(forKey: #keyPath(Person2.name))
print(name2)
let path1 = #keyPath(Person2.name)
let path2 = \Person2.name
print("\(path1) <---> \(path2)")
}
关于独占内存的特性 2 和SIMD的特性3,如果有具体实现代码,欢迎留言探讨~