swift語法更新
-
SE-0200 原始字符串
添加了創(chuàng)建原始字符串的功能先紫,其中\
和""
被解釋為這些文字符號本身,而不是轉(zhuǎn)義字符或字符串終止符。這使得許多功能更加容易實(shí)現(xiàn)墓臭,比如正則表達(dá)式稽煤。
要使用原始字符串核芽,請?jiān)谧址胺胖靡粋€(gè)或多個(gè)#
號,如下所示:
//正則表達(dá)式 regex1 == regex2
let regex1 = "\\\\[A-Z]+[A-Za-z]+\\.[a-z]+"
let regex2 = #"\\[A-Z]+[A-Za-z]+\.[a-z]+"#
let keypaths = #"Swift 中的 keypaths 格式像這樣: \Person.name ."#
//原始字符串中包含#
let anotherString = ##"這是一個(gè)包含“#”的原始字符串"##
//多行字符串的原始字符串
let multiline = #"""
這是一個(gè)多行字符串:,
“我才是
多行字符串”酵熙。
"""#
//原始字符串中插值
let answer = 42
let dontpanic = #"宇宙的終極答案是:\#(answer)."#
請注意轧简,我如何使用
\(answer)
來使用字符串插值\(answer)
將被解釋為字符串中的字符,因此當(dāng)您希望在原始字符串中進(jìn)行字符串插值時(shí)匾二,必須添加額外的`#'
2.SE-0235 在標(biāo)準(zhǔn)庫中引入“Result”類型哮独,使我們能夠更簡單拳芙、更清晰地處理復(fù)雜代碼(如異步API)中的錯(cuò)誤。
swift的“Result”類型實(shí)現(xiàn)為具有兩種情況的枚舉:“success”和“failure”皮璧。兩者都是使用泛型實(shí)現(xiàn)的舟扎,這樣它們就可以有一個(gè)相關(guān)值,但是“failure”必須是符合swift的“Error”類型恶导。(如果你之前使用過這個(gè)庫Result浆竭,你會發(fā)現(xiàn)他們幾乎一模一樣)
3.SE-0228字符串插值系統(tǒng)的升級:新增了用于調(diào)試struct
的輸出方法,如果你需要自定義某結(jié)構(gòu)體的輸出你需要擴(kuò)展String.StringInterpolation
并實(shí)現(xiàn)appendInterpolation()
方法
struct User {
var name: String
var age: Int
}
extension String.StringInterpolation {
mutating func appendInterpolation(_ value: User) {
appendInterpolation("My name is \(value.name) and I'm \(value.age)")
}
}
let user = User(name: "Guybrush Threepwood", age: 33)
print("User details: \(user)")
//輸出:User details: My name is Guybrush Threepwood and I'm 33
//格式化插值到字符串
extension String.StringInterpolation {
mutating func appendInterpolation(_ number: Int, style: NumberFormatter.Style) {
let formatter = NumberFormatter()
formatter.numberStyle = style
if let result = formatter.string(from: number as NSNumber) {
appendLiteral(result)
}
}
}
let number = Int.random(in: 0...100)
let lucky = "The lucky number this week is \(number, style: .spellOut)."
print(lucky)
//輸出:The lucky number this week is sixty-three.
在此基礎(chǔ)上用戶可以擴(kuò)展更多類型的差之方法如:輸出小數(shù)位數(shù),控制電話號碼格式惨寿,郵件格式等等邦泄,更多例子可以查看下方whats-new-in-swift-5-0
注意:舊
_ExpressibleByStringInterpolation
協(xié)議已被刪除; 任何使用此協(xié)議的代碼都需要針對新設(shè)計(jì)??進(jìn)行更新。一個(gè)#if compiler
塊可用于條件化4.2和5.0之間的代碼裂垦,例如:
#if compiler(<5.0)
extension MyType : _ExpressibleByStringInterpolation { ... }
#else
extension MyType : ExpressibleByStringInterpolation { ... }
#endif
4.SE-0216新增語法糖 @dynamicCallable
顺囊,@dynamicallable
是swift 4.2的@dynamicmemberlookup
的擴(kuò)展,其作用相同:使swift代碼更容易與動態(tài)語言(如python和javascript)一起工作蕉拢。
5.SE-0192新增 @unknown
關(guān)鍵字特碳,此關(guān)鍵詞可以用在switch語句中,Swift它要求所有switch語句覆蓋所有情況晕换,但有時(shí)我們需要忽略一些枚舉值午乓,我們使用default去處理忽略的情況,但當(dāng)我們新增一個(gè)枚舉類型闸准,我們的switch語句沒有更改益愈,他也不再會提示錯(cuò)誤,因?yàn)閐efault以及處理了新的情況夷家,為了更好地提示開發(fā)者使用@unknown default
和原default具有相同的功能蒸其,并且編譯器回升弄成一個(gè)警告??提醒用戶沒有處理所有情況:
enum PasswordError: Error {
case short
case obvious
case simple
}
//這個(gè)方法沒有任何提示
func showOld(error: PasswordError) {
switch error {
case .short:
print("Your password was too short.")
case .obvious:
print("Your password was too obvious.")
default:
print("Your password was too simple.")
}
}
func showNew(error: PasswordError) {
switch error { //此行警告??Switch must be exhaustive
case .short:
print("Your password was too short.")
case .obvious:
print("Your password was too obvious.")
@unknown default:
print("Your password wasn't suitable.")
}
}
6.SE-0230修改try
的嵌套方式
struct User {
var id: Int
init?(id: Int) {
if id < 1 {
return nil
}
self.id = id
}
func getMessages() throws -> String {
// complicated code here
return "No messages"
}
}
let user = User(id: 1)
let messages = try? user?.getMessages()
在swift4.2中上方代碼中messages的類型將會是一個(gè)String??
類型,在swift5中你會得到一個(gè)String库快?
類型摸袁,這意味著,鏈?zhǔn)秸{(diào)用不會再使可選值發(fā)生嵌套义屏。
7.SE-0225整數(shù)類型新增函數(shù)isMultiple(of:)
判斷是否是一個(gè)數(shù)的倍數(shù)
let rowNumber = 4
if rowNumber.isMultiple(of: 2) {
print("Even")
} else {
print("Odd")
}
8.SE-0218字典類型新增方法compactMapValues()
,用于轉(zhuǎn)換字典value
的類型(空值將被移除)
let times = [
"Hudson": "38",
"Clarke": "42",
"Robinson": "35",
"Hartis": "DNF"
]
//將[String:String]轉(zhuǎn)換成[String:Int]
let finishers1 = times.compactMapValues { Int($0) }
let finishers2 = times.compactMapValues(Int.init)
// ["Hudson": 38, "Clarke": 42, "Robinson": 35]
9.SE-0213通過字面量強(qiáng)制初始化,
如果T
符合其中一個(gè)ExpressibleBy*
協(xié)議并且literal
是一個(gè)文字表達(dá)式靠汁,那么T(literal)
將使用一個(gè)和T
的類型相同的構(gòu)造方法,而不是使用T
的默認(rèn)構(gòu)造函數(shù)
struct Q: ExpressibleByStringLiteral {
typealias StringLiteralType = String
var question: String
init?(_ possibleQuestion: StringLiteralType) {
return nil
}
init(stringLiteral str: StringLiteralType) {
self.question = str
}
}
_ = Q("ultimate question") // 'nil'
_ = "ultimate question" as Q // Q(question: 'ultimate question')
10.SR-5719在Swift 5模式下闽铐,@autoclosure參數(shù)不能再轉(zhuǎn)發(fā)到另一個(gè)函數(shù)調(diào)用中的@autoclosure參數(shù)膀曾。相反,必須使用()顯式調(diào)用函數(shù)值阳啥;調(diào)用本身被包裝在隱式閉包中添谊,以確保與swift 4模式中的行為相同。
func foo(_ fn: @autoclosure () -> Int) {}
func bar(_ fn: @autoclosure () -> Int) {
foo(fn) // ? `fn` can't be forwarded and has to be called
foo(fn()) // ?
}
11.SR-695在Swift 5模式中察迟,返回Self
的類方法不能再被返回非最終具體類類型的方法重寫斩狱。此類代碼不是類型安全的耳高,需要更新。
class Base {
class func factory() -> Self { ... }
}
class Derived : Base {
class override func factory() -> Derived { ... }
}
12.SR-5581協(xié)議現(xiàn)在可以將它們的符合類型約束為給定類的子類所踊。支持兩種等效形式:
protocol MyView : UIView { ... }
protocol MyView where Self : UIView { ... }
請注意泌枪,Swift 4.2接受了第二種形式,但它沒有完全實(shí)現(xiàn)秕岛,有時(shí)可能會在編譯時(shí)或運(yùn)行時(shí)崩潰碌燕。
swift5適配遇到的問題
升級xcode10.2后代碼幾乎無需調(diào)整,如果你使用了阿里的HandyJson继薛,會因?yàn)?a target="_blank" rel="nofollow">Swift 5 Type Metadata的變動導(dǎo)致編譯失敗修壕,在本文編寫前該項(xiàng)目已提交更新,但版本號4.2.1
未發(fā)生變化遏考,意味著使用cocoapods集成的同學(xué)使用pod update
將無法更新代碼慈鸠。解決方法先移除podfile
文件中的handyjson進(jìn)行pod update
,清空cocoapods
緩存,添加handyjson
到podfile
重新pod upate
或者直接切換到5.0分枝
pod 'HandyJSON', git: '[https://github.com/alibaba/HandyJSON.git](https://github.com/alibaba/HandyJSON.git)' , branch: 'dev_for_swift5.0'
XCode 10.2更新
- Interface Builder:雙擊故事板不再縮放灌具。使用觸控板上的捏合手勢進(jìn)行縮放或按住Option并滾動青团。
- LLDB調(diào)試:可以使用LLDB調(diào)試在閉包內(nèi)的表達(dá)式
$0,$1......
- LLDB現(xiàn)在支持C的可變長數(shù)組
- LLDB調(diào)試器有一個(gè)新的命令別名咖楣,
v
用于“幀變量”命令督笆,用于在當(dāng)前堆棧幀中打印變量。因?yàn)樗@過表達(dá)式評估器诱贿,v比p或po優(yōu)先級更高娃肿,并且速度更快 - Xcode使用SSH配置來確定應(yīng)該使用哪個(gè)SSH密鑰來驗(yàn)證遠(yuǎn)程存儲庫。
- 更多內(nèi)容瀏覽下方文檔
Xcode 10.2 Release Notes
參考文檔
1.whats-new-in-swift-5-0
2.swift change Log
3.swift-5-released
4.Xcode 10.2 Release Notes