swift5.0的新特性

1 增加了# 符号,使字符串更加简单

   1. 在字符串中包含“时不必添加\

   2 .包含\反斜杠也不需要再加转义符,直接前后加#号即可

   3. 当字符串包含#时,前后应用##包裹字符串

    4. 用#“”“”开头""""#结尾来表示多行字符串

    正则表达式中因为不用反斜杠转义,使得正则表达式更加简洁明了

2 在枚举中新增加了一个@unknow 修饰default分支,使得enum中的中增加case的时候,编译器会在该enum后面加警告

3 integers新增加了一个isMultiple(of:)方法用来检测一个数是另外一个数的倍数

4 数组增加了一个count(where:)相当于filter()+count的结果,使他更加简洁一步到位  let scores = [100,80,85]
        let passCount = scores.filter{($0 >= 85)}.count
        
        //after 避免生成一个数组
        let scores = [100,80,85]
        let passCount = scores.count { $0 >= 85}

5 字典增加了一个方法compactMapValues()方法,相当于数组的compactMap,可以过滤nil,类型转换

  //通过compactMapValues 将值转换成integer类型,并且将DNF过滤掉
        let finishers1 = times.compactMapValues { Int($0) }
        //也可以这样写
        let finishers2 = times.compactMapValues(Int.init)
        
        // 过滤nil
        let people = [
            "Paul": 38,
            "Sophie": 8,
            "Charlotte": 5,
            "William": nil
        ]
        let knownAges = people.compactMapValues { $0 }
//        Al
        
        let scores = [100,80,85]
        
        let passCount = scores.count { $0 >= 85}

6 字符串由之前的      String(stringInterpolationSegment: language)变成  DefaultStringInterpolation(
            literalCapacity: 7,
            interpolationCount: 1)

7 swift5 标准库里面增加了Result枚举

  // 1
        enum ConnectionError: Error {
            case noNetwork, noDatabase
        }
        
        // 2
        let networkSuccess = Result<String, ConnectionError>.success("Network connected!")
        let databaseSuccess = Result<String, ConnectionError>.success("Database connected!")
        let networkFailure = Result<String, ConnectionError>.failure(.noNetwork)
        let databaseFailure = Result<String, ConnectionError>.failure(.noDatabase)
        let sameSuccess = networkSuccess == databaseSuccess
        let sameFailure = networkFailure == databaseFailure
        let success: Set = [networkSuccess, databaseSuccess]
        let failure: Set = [networkFailure, databaseFailure]
        let successDictionary = [
            networkSuccess: try! networkSuccess.get(),
            databaseSuccess: try! databaseSuccess.get()
        ]
        let failureDictionary = [
            networkFailure: ConnectionError.noNetwork,
            databaseFailure: ConnectionError.noDatabase
        ]

8 增加了Python或Ruby等脚本语言交互的动态可调用类型

 @dynamicCallable
        class DynamicFeatures {
            // 2
            func dynamicallyCall(withArguments params: [Int]) -> Int? {
                guard !params.isEmpty else {
                    return nil
                }
                return params.reduce(0, +)
            }
            
            func dynamicallyCall(withKeywordArguments params: KeyValuePairs<String, Int>) -> Int? {
                guard !params.isEmpty else {
                    return nil
                }
                return params.reduce(0) { $1.key.isEmpty ? $0 : $0 + $1.value }
            }
        }
        
        // 3
        let features = DynamicFeatures()
        features() // nil
        features(3, 4, 5) // 12
        features(first: 3, 4, second: 5) // 8

10 swift为package增加了一些新特性,可以在Package.swift中定义部署目标平台的最低版本

let package = Package(name: “Package”, platforms: [
                                                   .macOS(.v10_14),
                                                   .iOS(.v12),
                                                   .tvOS(.v12),
                                                   .watchOS(.v5)
                                                   ])

11 Swift增加了对Codable的范围支持

let temperature = 0...10
let encoder = JSONEncoder()
let data = try! encoder.encode(temperature)
let decoder = JSONDecoder()
let temperatureRange = try! decoder.decode(ClosedRange<Int>.self, from: data)


12 移除Collection的定制点

extension Array {
    var first: Element? {
        return !isEmpty ? self[count - 1] : nil
    }
    
    var last: Element? {
        return !isEmpty ? self[0] : nil
    }
}

let names = ["Cosmin", "Oana", "Sclip", "Nori"]
names.first // "Nori"
names.last // "Cosmin"

swift中可以直接通过first和last来访问值

13 swift4.2使用self来访问

class Tutorial {
  let title: String
  let author: String
  init(title: String, author: String) {
    self.title = title
    self.author = author
  }
}

var tutorial = Tutorial(title: "What's New in Swift 5.0?", author: "Cosmin Pupaza")
tutorial.self = Tutorial(title: "What's New in Swift 5?", author: "Cosmin Pupăză")

swift5.0可以使用keyPath来访问

tutorial[keyPath: \.self] = Tutorial(
  title: "What's New in Swift 5?",
  author: "Cosmin Pupăză")

14 字面量的强制通过

let value = UInt64(0xFFFF_FFFF_FFFF_FFFF)

15 swift在条件检查时增加了 <使条件描述更清晰

#if swift(<5)
  evenNumber = favoriteNumber % 2 == 0   
#else
  evenNumber = favoriteNumber.isMultiple(of: 2)  
#endif

16 对于4.2种的枚举使用可变参数

enum BlogPost {
  case tutorial(_: String...)
  case article(_: String...)
}

swift取而代之的使用数组

enum BlogPost {
  case tutorial([String])
  case article([String])
}

17 swift 4.3的字面的偏移

let swiftVersion = "Swift 4.2"
let offset = swiftVersion.endIndex.encodedOffset

swift5.0中字面量的偏移 

let swiftVersion = "Swift 5"
let offset = swiftVersion.endIndex.utf16Offset(in: swiftVersion)

18 

SIMD 向量

Swift 5 将处理器的 SIMD 类型操作添加到标准库中,为 SIMD 向量和矩阵提供底层支持。 该特性也简化了<simd/simd.h> 中的 Objective-C、C 和 C++实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值