Swift 5有什麼新功能?

好消息! Swift 5最終在Xcode 10.2中可用! 此版本帶來了ABI的穩定性,並經過一些期待已久的功能改進了語言。git

注意: 當前版本爲Swift 5, iOS 12, Xcode 10, 如轉載本文章, 請聯繫做者, 並給出文章的源地址github

在本教程中,您將瞭解Swift 5中最重要的更改. Swift 5須要Xcode 10.2,所以請確保在開始以前已安裝好。正則表達式

入門

Swift 5Swift 4.2兼容,但與早期的Swift版本不兼容。可是,因爲ABI穩定性,將來版本將與Swift 5二進制兼容。算法

ABI穩定性支持使用不一樣Swift版本編譯的應用程序和庫之間的二進制兼容性。 Swift標準庫和運行時嵌入在操做系統中,所以應用程序不會在任何平臺上分發本身的庫副本。這致使更好的工具解耦和OS集成。express

您還須要ABI穩定性來分發跨多個Swift版本的二進制框架。這須要模塊格式穩定性,這能夠穩定包含編譯器的框架公共接口表示的模塊文件。swift

您將在本教程的每一個部分中找到相似**[SE-0001]**的Swift Evolution建議編號。您能夠瀏覽每一個提案連接,詳細瞭解每項新變化。api

遵循本教程的最佳方法是在操場上試用新功能。數組

啓動Xcode 10.2並選擇File ▸ New ▸ Playground。將平臺設置爲iOS,將模板設置爲Blank。命名並將其保存在您想要的任何地方開始的時候了!app

注意:須要快速提醒一下Swift 4.2亮點? 查看Swift 4.2教程:Swift 4.2中有哪些新功能?框架

語言改進

Swift 5中有許多語言功能,例如動態可調用類型,處理將來的枚舉等等。

Integer的Multiple檢測

Swift 4.2中,您可使用餘數運算符肯定數字是不是另外一個的倍數:

let firstNumber = 4
let secondNumber = 2
if secondNumber != 0 && firstNumber % secondNumber == 0 {
  print("\(secondNumber) * \(firstNumber / secondNumber) = \(firstNumber)")
}
複製代碼

這段代碼的工做原理:

  1. 檢查secondNumber是否爲0
  2. 檢查將firstNumber除以secondNumber會返回0的餘數。
  3. 執行除法運算。

您必須檢查secondNumber是否爲0,由於運算符會拋出錯誤。

Swift 5經過向BinaryInteger SE-0225添加isMultiple(of :)來簡化這一過程:

if firstNumber.isMultiple(of: secondNumber) {
  print("\(secondNumber) * \(firstNumber / secondNumber) = \(firstNumber)")
}
複製代碼

即便你將參數傳遞給0isMultiple(of :)也能夠工做,結果代碼更清晰。

避免轉義字符串

Swift 4.2使用轉義序列來表示字符串中的反斜槓和引號:

let escape = "You use escape sequences for \"quotes\"\\\"backslashes\" in Swift 4.2."
let multiline = """
                You use escape sequences for \"\"\"quotes\"\"\"\\\"\"\"backslashes\"\"\"
                on multiple lines
                in Swift 4.2.
                """
複製代碼

Swift 5添加轉義字符串的新方式。 您在字符串的開頭和結尾添加#,這樣您就可使用反斜槓和引號而不會出現問題。SE-0200

let raw = #"You can create "raw"\"plain" strings in Swift 5."#
let multiline = #"""
                You can create """raw"""\"""plain""" strings
                on multiple lines
                in Swift 5.
                """#
複製代碼

在原始字符串中使用字符串插值時,必須在反斜槓後使用#號:

let track = "Nothing Else Matters"
print(#"My favorite tune\song is \#(track)."#)
複製代碼

在某些狀況下,您須要在字符串的開頭和結尾使用多個#

let hashtag = ##"You can use the Swift "hashtag" #swift in Swift 5."##
複製代碼

在上面的代碼中,您在hashtag的開頭和結尾添加##,以便您能夠在字符串中表示#。 字符串開頭使用的#必須與其末尾的數字相匹配。

Swift 4.2中,您能夠在正則表達式中轉義反斜槓,以下所示:

// 1
let versions = "3 3.1 4 4.1 4.2 5"
let range = NSRange(versions.startIndex..., in: versions)
// 2
let regex = try! NSRegularExpression(pattern: "\\d\\.\\d")
// 3
let minorVersions = regex.matches(in: versions, range: range)
// 4
minorVersions.forEach { print(versions[Range($0.range, in:  versions)!]) }
複製代碼

如下是此代碼的工做原理:

  1. 聲明版本並定義覆蓋整個字符串的範圍。
  2. 定義一個匹配版本中全部次要Swift版本的正則表達式。
  3. 使用matches(in: options: range:)肯定次要版本範圍。
  4. 使用範圍從版本中獲取次要版本。

Swift 5使用原始字符串簡化了正則表達式:

let regex = try! NSRegularExpression(pattern: #"\d\.\d"#)
複製代碼

在此代碼中,您使用反斜槓數量的一半來編寫正則表達式,由於您不須要在原始字符串中轉義反斜槓。

圖片

注意:須要有關正則表達式如何在Swift中工做的更多詳細信息? 查看正則表達式教程:正則表達式簡介

使用Character新的屬性

在處理字符時,Swift 4.2須要常見任務的變通方法:

let id = "ID10"
var digits = 0
id.forEach { digits += Int(String($0)) != nil ? 1 : 0 }
print("Id has \(digits) digits.")
複製代碼

在此代碼中,首先將每一個字符轉換爲String,而後再轉換爲Int,以肯定id的位數。

可是,Swift 5Character添加了屬性,使角色更易於使用SE-0221

id.forEach { digits += $0.isNumber ? 1 : 0 }
複製代碼

在這種狀況下,您使用isNumber來檢查每一個字符是否都是數字。 查看您可使用的其餘屬性的提案。

使用新的Unicode標量屬性

Swift 4.2中,您爲Unicode標量實現了文本處理算法,以下所示:

let username = "bond007"
var letters = 0
username.unicodeScalars.forEach { 
  letters += (65...90) ~= $0.value || (97...122) ~= $0.value ? 1 : 0
}
print("Username has \(letters) letters.")
複製代碼

在此代碼中,您能夠經過檢查每一個字符的Unicode標量是表明小寫字母仍是大寫字母來計算用戶名的字母數。

Swift 5Unicode標量添加了屬性,簡化了文本處理SE-0211

username.unicodeScalars.forEach { letters += $0.properties.isAlphabetic ? 1 : 0 }
複製代碼

在此代碼中,您使用isAlphabetic檢查每一個字符是否爲數字。 連接的提案顯示您能夠檢查的全部屬性。

刪除子序列

Swift 4.2Sequence自定義點返回SubSequence,以下所示:

extension Sequence {
  func remove(_ s: String) -> SubSequence {
    guard let n = Int(s) else {
      return dropLast()
    }
    return dropLast(n)
  }
}

let sequence = [5, 2, 7, 4]
sequence.remove("2") // [5, 2]
sequence.remove("two") // [5, 2, 7]
複製代碼

在這種狀況下,若是sInt或最後一個元素,remove(_ :)將刪除序列中的最後n個元素。

Swift 5用序列中的具體類型替換SubSequence SE-0234

extension Sequence {
  func remove(_ s: String) -> [Element] {
    guard let n = Int(s) else {
      return dropLast()
    }
    return dropLast(n)
  }
}
複製代碼

在此代碼中,remove(_ :)返回[Element],由於dropLast()dropLast(_ :)返回[Element]

字典更新

Swift 5爲詞典帶來了期待已久的改進:

壓縮字典

Swift 4.2使用mapValuesfilterreduce來過濾字典中的nil值,以下所示:

let students = ["Oana": "10", "Nori": "ten"]
let filterStudents = students.mapValues(Int.init)
  .filter { $0.value != nil }
  .mapValues { $0! }
let reduceStudents = students.reduce(into: [:]) { $0[$1.key] = Int($1.value) }
複製代碼

此代碼使用帶有filterreducemapValues來肯定學生的有效成績。 這兩種方法都須要屢次字典傳遞並使代碼複雜化。

Swift 5使用compactMapValues(_ :)來得到更有效的解決方案SE-0218

let mapStudents = students.compactMapValues(Int.init)
複製代碼

它以更少的代碼行完成一樣的事情,整潔!

重命名DictionaryLiteral爲KeyValuePairs

Swift 4.2使用DictionaryLiteral來聲明字典,以下所示

let pets: DictionaryLiteral = ["dog": "Sclip", "cat": "Peti"]
複製代碼

DictionaryLiteral不是字典或文字。 這是一個鍵值對列表。

Swift 5DictionaryLiteral重命名爲KeyValuePairs SE-0214

let pets: KeyValuePairs = ["dog": "Sclip", "cat": "Peti"]
複製代碼

數字協議更新

Swift 4.2爲向量實現數值:

// 1
struct Vector {
  let x, y: Int
  
  init(_ x: Int, _ y: Int) {
    self.x = x
    self.y = y
  }
}

// 2
extension Vector: ExpressibleByIntegerLiteral {
  init(integerLiteral value: Int) {
    x = value
    y = value
  }
}

// 3
extension Vector: Numeric {
  var magnitude: Int {
    return Int(sqrt(Double(x * x + y * y)))
  }  

  init?<T>(exactly value: T) {
    x = value as! Int
    y = value as! Int
  }
  
  static func +(lhs: Vector, rhs: Vector) -> Vector {
    return Vector(lhs.x + rhs.x, lhs.y + rhs.y)
  }
  
  static func +=(lhs: inout Vector, rhs: Vector) {
    lhs = lhs + rhs
  }
  
  static func -(lhs: Vector, rhs: Vector) -> Vector {
    return Vector(lhs.x - rhs.x, lhs.y - rhs.y)
  }
  
  static func -=(lhs: inout Vector, rhs: Vector) {
    lhs = lhs - rhs
  }
  
  static func *(lhs: Vector, rhs: Vector) -> Vector {
    return Vector(lhs.x * rhs.y, lhs.y * rhs.x)
  }
  
  static func *=(lhs: inout Vector, rhs: Vector) {
    lhs = lhs * rhs
  }
}

// 4
extension Vector: CustomStringConvertible {
  var description: String {
    return "(\(x) \(y))"
  }
}
複製代碼

如下是此代碼的工做原理:

  1. Vector聲明xyinit(_: _ :)

  2. 實現init(integerLiteral :)以使Vector符合ExpressibleByIntegerLiteral做爲數字一致性的要求。

  3. 經過定義向量的大小,聲明init(exactly:)並實現+(lhs: rhs :)+=(lhs: rhs :)-(lhs: rhs :)-=(lhs: rhs: )*(lhs:rhs :)*=(lhs: rhs :)

  4. 實現描述以使Vector符合CustomStringConvertible

上面的代碼使您能夠輕鬆地使用向量:

var first = Vector(1, 2) // (1,2)
let second = Vector(3, 4) // (3,4)
let third = first + second // (4,6)
first += second // (4,6)
let fourth = first - second // (1,2)
first -= second // (1,2)
複製代碼

Swift 5實現了向量的AdditiveArithmetic,由於您沒法定義2D向量的叉積SE-0233。 它不須要ExpressibleByIntegerLiteral一致性:

extension Vector: AdditiveArithmetic {
  static var zero: Vector {
    return Vector(0, 0)
  }
  
  static func +(lhs: Vector, rhs: Vector) -> Vector {
    return Vector(lhs.x + rhs.x, lhs.y + rhs.y)
  }
  
  static func +=(lhs: inout Vector, rhs: Vector) {
    lhs = lhs + rhs
  }
  
  static func -(lhs: Vector, rhs: Vector) -> Vector {
    return Vector(lhs.x - rhs.x, lhs.y - rhs.y)
  }
  
  static func -=(lhs: inout Vector, rhs: Vector) {
    lhs = lhs - rhs
  }
}
複製代碼

在這段代碼中,你經過定義零並實現+(lhs: rhs :)+=(lhs: rhs :)-(lhs: rhs :)- =(lhs: rhs :)來使Vector符合AdditiveArithmetic

圖片

注意:想要了解有關Swift中運算符重載的更多信息? 查看運算符重載教程:在Swift中重載自定義運算符

字符串插值更新

Swift 4.2經過插入段實現字符串插值:

let language = "Swift"
let languageSegment = String(stringInterpolationSegment: language)
let space = " "
let spaceSegment = String(stringInterpolationSegment: space)
let version = 4.2
let versionSegment = String(stringInterpolationSegment: version)
let string = String(stringInterpolation: languageSegment, spaceSegment, versionSegment)
複製代碼

在此代碼中,編譯器首先包裝每一個文本段,而後使用init(stringInterpolationSegment :)插入一個。 而後,它用init(stringInterpolation :)將全部段包裝在一塊兒。

Swift 5採用了徹底不一樣的方法SE-0228:

// 1
var interpolation = DefaultStringInterpolation(
  literalCapacity: 7,
  interpolationCount: 1)
// 2
let language = "Swift"
interpolation.appendLiteral(language)
let space = " "
interpolation.appendLiteral(space)
let version = 5
interpolation.appendInterpolation(version)
// 3
let string = String(stringInterpolation: interpolation)
複製代碼

這是代碼的做用:

  1. 使用特定容量和插值計數定義DefaultStringInterpolation實例。
  2. 調用appendLiteral(_ :)appendInterpolation(_ :)將文字和插值添加到插值中。
  3. 經過調用init(stringInterpolation :)生成最終的插值字符串。

處理將來的查點案件

Swift 4.2沒法正確處理新的枚舉案例,以下所示:

// 1
enum Post {
  case tutorial, article, screencast, course
}

// 2
func readPost(_ post: Post) -> String {
  switch post {
    case .tutorial:
      return "You are reading a tutorial."
    case .article:
      return "You are reading an article."
    default:
      return "You are watching a video."
  }
}

// 3
let screencast = Post.screencast
readPost(screencast) // "You are watching a video."
let course = Post.course
readPost(course) // "You are watching a video."
複製代碼

如下是上面代碼中發生的狀況:

  1. 在網站上定義全部類型的博客文章。
  2. 要使交換機無窮盡,請添加默認值。
  3. 因爲截屏視頻和課程是視頻,所以默認處理.screencast.course

如下是處理播客在Swift 4.2中的工做原理:

enum Post {
  case tutorial, article, podcast, screencast, course
}

let podcast = Post.podcast
readPost(podcast) // "You are watching a video."
複製代碼

在此代碼中,您使用默認處理.podcast,即便播客不是視頻。 Swift 4.2不會對此發出警告,由於該開關是詳盡無遺的。

Swift 5處理添加的枚舉案例SE-0192

func readPost(_ post: BlogPost) -> String {
  switch post {
    case .tutorial:
      return "You are reading a tutorial."
    case .article:
      return "You are reading an article."
    @unknown default:
      return "You are reading a blog post."
  }
}

readPost(screencast) // "You are reading a blog post."
readPost(course) // "You are reading a blog post."
readPost(podcast) // "You are reading a blog post."
複製代碼

在此代碼中,您將默認標記爲**@unknown**,而且Swift警告您切換並不是詳盡無遺。 默認處理.screencast.course.podcast,由於截屏視頻,課程和播客是博客文章。

圖片

Result

Swift 5Result添加到標準庫SE-0235

// 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
]
複製代碼

如下是此代碼的工做原理:

  1. 聲明最多見的鏈接錯誤。
  2. 比較鏈接結果,將它們添加到集合中。 您使用這些集做爲字典的鍵,由於Result實現了EquatableHashable

遵循Equatable和Hashable的Never類

Swift 5符合Never to EquatableHashable SE-0215

let alwaysSucceeds = Result<String, Never>.success("Network connected!")
let neverFails = Result<String, Never>.success("Database connected!")
let alwaysFails = Result<Never, ConnectionError>.failure(.noNetwork)
let neverSucceeds = Result<Never, ConnectionError>.failure(.noDatabase)
let sameValue = alwaysSucceeds == neverFails
let sameError = alwaysFails == neverSucceeds
let alwaysSuccess: Set = [alwaysSucceeds, neverFails]
let alwaysFailure: Set = [alwaysFails, neverSucceeds]
let alwaysSuccessDictionary = [
  alwaysSucceeds: try! alwaysSucceeds.get(),
  neverFails: try! neverFails.get()
]
let alwaysFailureDictionary = [
  alwaysFails: ConnectionError.noNetwork,
  neverSucceeds: ConnectionError.noDatabase
]
複製代碼

在此代碼中,您定義始終返回值或錯誤的鏈接結果,比較它們,將它們添加到集合並將它們用做字典鍵。

動態可調用類型

Swift 5定義了可與腳本語言(如PythonRuby)互操做的動態可調用類型SE-0216

// 1
@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
複製代碼

上面的代碼以下:

  1. DynamicFeatures標記爲**@dynamicCallable**以使其成爲動態可調用類型。

  2. 要使DynamicFeatures符合**@dynamicCallable**,請實現dynamicCallwithArguments :)和dynamicCall(withKeywordArguments :)

  3. 使用普通語法調用功能,編譯器調用dynamicCall(withArguments :)dynamicCall(withKeywordArguments :)

Swift Package Manager更新

Swift 5Swift Package Manager添加了一些功能:

平臺部署設置

Swift 5容許您在Package.swift SE-0236中定義所需的最低平臺部署目標版本:

let package = Package(name: 「Package」, platforms: [
  .macOS(.v10_14), 
  .iOS(.v12),
  .tvOS(.v12), 
  .watchOS(.v5)
])
複製代碼

您能夠在SupportedPlatform中使用macOS()iOS()tvOS()watchOS()來設置Package所需的最低平臺版本。

目標構建設置

Swift 5Package.swift中聲明瞭特定於目標的構建設置。 它們定製包管理器在目標構建期間如何調用構建工具SE-0238

依賴鏡像

Swift 5Swift Package Manager SE-0219帶來了依賴鏡像。

swift package config set-mirror --package-url <package> --mirror-url <mirror>
複製代碼

即便原始源不可用或被刪除,鏡像也容許您訪問依賴項。

set-mirror使用鏡像更新依賴項,後者替換全部其餘鏡像。

使用unset-mirror從依賴項中刪除鏡像:

swift package config unset-mirror --package-url <package>
swift package config unset-mirror —mirror-url <mirror> 
swift package config unset-mirror --all
複製代碼

其餘的一些改進

Swift 5還增長了一些其餘急需的功能和改進:

製做可編碼範圍

Swift 5增長了Codable對範圍的一致性SE-0239

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)
複製代碼

您使用JSONEncoder對溫度進行編碼並使用JSONDecoder解碼數據,由於默認狀況下,範圍在Swift 5中實現了Codable

展平嵌套的Optionals

Swift 4.2使用**try?**建立嵌套的選項:

extension Int {
  // 1
  enum DivisionError: Error {
    case divisionByZero
  }
  
  // 2
  func divideBy(_ number: Int) throws -> Int {
    guard number != 0 else {
      throw DivisionError.divisionByZero
    }
    return self / number
  }
}

// 3
let number: Int? = 10
let division = try? number?.divideBy(2)
if let division = division, 
   let final = division {
  print(final)
}
複製代碼

這是代碼的做用:

  1. 使用DivisionError擴展Int
  2. divideBy(_ :)若是number0則拋出.divisionByZero
  3. 解開分區兩次,由於它是一個Int??

Swift 5以不一樣的方式處理SE-0230

if let division = division {
  print(division)
}
複製代碼

嘗試? 在Swift 5中不會建立嵌套的選項,所以你須要解包一次,由於它是一個Int?

從Collection中刪除自定義點

您能夠從Swift 4.2中的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 5從集合SE-0232中刪除了它們的自定義點。

Identity Key的路徑

Swift 4.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ă")
複製代碼

在此代碼中,您使用.self一次性更改教程的標題和做者。

Swift 5爲值訪問添加了identity key路徑SE-0227

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

在此代碼中,您使用\.self來更新教程。

經過強制來初始化

Swift 5中,若是類型符合文字協議SE-0213,則文字初始化程序將文字強制轉換爲其類型:

let value = UInt64(0xFFFF_FFFF_FFFF_FFFF)
複製代碼

Swift 4.2中,上面的代碼行在編譯時產生溢出錯誤。

Swift版本編譯的更新

Swift 4.2在編譯條件中使用>=

let favoriteNumber = 10
var evenNumber = true

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

#if !compiler(>=5)
  evenNumber = favoriteNumber % 2 == 0  
#else
  evenNumber = favoriteNumber.isMultiple(of: 2)
#endif
複製代碼

這些條件檢查Swift版本是否大於或等於5,並在知足條件時編譯這些代碼。

Swift 5增長<用於更清潔的條件SE-0224

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

#if compiler(<5)
  evenNumber = favoriteNumber % 2 == 0 
#else
  evenNumber = favoriteNumber.isMultiple(of: 2)   
#endif
複製代碼

使用具備關聯值的枚舉個案的可變參數

您能夠在Swift 4.2中使用具備關聯值的枚舉狀況的可變參數:

enum BlogPost {
  case tutorial(_: String...)
  case article(_: String...)
}
複製代碼

您可使用String...獲取教程和文章詳細信息。 這在Swift 5中是不可能的,因此你應該使用數組:

enum BlogPost {
  case tutorial([String])
  case article([String])
}
複製代碼

此次使用**[String]**設置教程和文章詳細信息。

棄用字符串索引編碼偏移量

Swift 4.2字符串使用UTF-16編碼。 所以,encodedOffset將返回UTF-16字符串的偏移量:

let swiftVersion = "Swift 4.2"
let offset = swiftVersion.endIndex.encodedOffset
複製代碼

在這裏你能夠得到swiftVersionendIndex的偏移量。 這對Swift 5中使用的UTF-8字符串編碼不起做用,所以Swift 5utf16Offset(in :)替換encodedOffset來處理這兩種狀況SE-0241

let swiftVersion = "Swift 5"
let offset = swiftVersion.endIndex.utf16Offset(in: swiftVersion)
複製代碼

新的指針方法

Swift 5添加了ConttiguousStorageIfAvailable(_ :)SequencewithContiguousMutableStorageIfAvailable(_ :)MutableCollection,爲協議擴展SE-0237中的withUnsafeBufferPointer(_ :)withUnsafeMutableBufferPointer(_ :)提供通用實現。

SIMD矢量更新

Swift 5將處理器的SIMD類型操做添加到標準庫中。它們爲SIMD向量和矩陣提供低級支持。它們還簡化了<simd/simd.h> SE-0229Objective-CC和**C++**實現。

而後去哪兒?

您可使用本教程頂部或底部的「下載材料」連接下載最終的Playground

Swift 5Swift 4.2增長了許多很酷的功能,使語言ABI穩定。這是語言發展過程當中的一個重要里程碑,由於從如今開始,這一變化將會減小。

您能夠在官方Swift CHANGELOGSwift標準庫差別上閱讀更多關於此版本Swift的更改。

您還能夠查看Swift Evolution提案,瞭解下一個Swift版本中會發生什麼變化。在這裏,您能夠針對當前正在審覈的提案提供反饋,甚至能夠自行提交提案!

項目示例: 項目工程地址

相關文章
相關標籤/搜索