Swift5新特性 & XCode 10.2更新


swift語法更新

  1. 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緩存,添加handyjsonpodfile重新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更新


  1. Interface Builder:雙擊故事板不再縮放灌具。使用觸控板上的捏合手勢進(jìn)行縮放或按住Option并滾動青团。
  2. LLDB調(diào)試:可以使用LLDB調(diào)試在閉包內(nèi)的表達(dá)式$0,$1......
  3. LLDB現(xiàn)在支持C的可變長數(shù)組
  4. LLDB調(diào)試器有一個(gè)新的命令別名咖楣,v用于“幀變量”命令督笆,用于在當(dāng)前堆棧幀中打印變量。因?yàn)樗@過表達(dá)式評估器诱贿,v比p或po優(yōu)先級更高娃肿,并且速度更快
  5. Xcode使用SSH配置來確定應(yīng)該使用哪個(gè)SSH密鑰來驗(yàn)證遠(yuǎn)程存儲庫。
  6. 更多內(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瘪松,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锨阿,更是在濱河造成了極大的恐慌宵睦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墅诡,死亡現(xiàn)場離奇詭異壳嚎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)末早,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門烟馅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人然磷,你說我怎么就攤上這事郑趁。” “怎么了姿搜?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵寡润,是天一觀的道長捆憎。 經(jīng)常有香客問我,道長梭纹,這世上最難降的妖魔是什么躲惰? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮变抽,結(jié)果婚禮上础拨,老公的妹妹穿的比我還像新娘。我一直安慰自己绍载,他們只是感情好诡宗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逛钻,像睡著了一般僚焦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曙痘,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天芳悲,我揣著相機(jī)與錄音,去河邊找鬼边坤。 笑死名扛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的茧痒。 我是一名探鬼主播肮韧,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旺订!你這毒婦竟也來了弄企?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤区拳,失蹤者是張志新(化名)和其女友劉穎拘领,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樱调,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡约素,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笆凌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乞而,死狀恐怖送悔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤放祟,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布鳍怨,位于F島的核電站,受9級特大地震影響跪妥,放射性物質(zhì)發(fā)生泄漏鞋喇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一眉撵、第九天 我趴在偏房一處隱蔽的房頂上張望侦香。 院中可真熱鬧,春花似錦纽疟、人聲如沸罐韩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽散吵。三九已至,卻和暖如春蟆肆,著一層夾襖步出監(jiān)牢的瞬間矾睦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工炎功, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留枚冗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓蛇损,卻偏偏與公主長得像赁温,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子淤齐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353