Swift4.2新特性 & XCode 10更新


swift語法更新

SE-0079 允許self在閉包中使用可選綁定

// swift3
guard let `self` = self else {return}

// swift4.2
guard let self = self else {return}

使用上面代碼分別在swift3昭卓、swift4.2的閉包中將弱引用的self轉(zhuǎn)為強引用张足。但是Apple的Chris Lattner表示swift3的寫法是“一個編譯器錯誤”触创。

SE-0197添加removeAll(where:)方法到標準庫,用于刪除集合中滿足條件的元素

//swift 3
var nums = [1,2,3,4,5]
// 刪除奇數(shù)
nums = nums.filter { !isOdd($0) }

//swift 4.2
nums.removeAll(where: isOdd)

filter方法完成此操作存在性能問題 1.重新分配了內(nèi)存为牍,2.需完整拷貝原數(shù)組

SE-0199添加.toggle()方法到BOOL值嗅榕,讓原值反轉(zhuǎn)

//swift 3
myVar.prop1.prop2.enabled = !myVar.prop1.prop2.enabled

//swift 4.2
myVar.prop1.prop2.enabled.toggle()

SE-0202隨機數(shù)生成API

// 生成隨機數(shù)
Int.random(in: 1...1000)
UInt8.random(in: .min ... .max)
Double.random(in: 0..<1)

// 隨機從數(shù)組中取值
let emotions = "??????????????????"
let randomEmotion = emotions.randomElement()! //可能是其中一個

// 數(shù)組亂序
let numbers = 1...10
let shuffled = numbers.shuffled()//1-10的亂序數(shù)組

SE-0204添加last(where:)lastIndex(where:)獲取集合中最后滿足條件的元素和位置

// swift 3
let a = [20, 30, 10, 40, 20, 30, 10, 40, 20]
a.first(where: { $0 > 25 })         // 30
a.index(where: { $0 > 25 })         // 1
a.index(of: 10)                     // 2
// 需要獲取最后的需要將集合倒序
(a.reversed().index(where: { $0 > 25 })?.base).map({ a.index(before: $0) })
// swift 4.2
a.last(where: { $0 > 25 })          // 40
a.lastIndex(where: { $0 > 25 })     // 7
a.lastIndex(of: 10)                 // 6

SE-0206Hashable重新設(shè)計

// swift 3
extension Point: Equatable{
    func ==(lhs: Testhash, rhs: Testhash) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }
}
extension Point: Equatable {
    var hashValue: Int {
        get {
            return self.x + self.y * self.x
        }
    }
}

// swift 4.2
extension Point: Equatable {
    static func ==(lhs: Point, rhs: Point) -> Bool {
        // Ignore distanceFromOrigin for determining equality
        return lhs.x == rhs.x && lhs.y == rhs.y
    }
}
extension Point: Hashable {
    func hash(into hasher: inout Hasher) {
        // Ignore distanceFromOrigin for hashing
        hasher.combine(x)
        hasher.combine(y)
    }
}

SE-0207集合新增.allSatisfy方法,判斷是否所有元素都滿足閉包內(nèi)的條件

// swift 3
//判斷所有數(shù)是否都是奇數(shù)
!nums.contains { !isOdd($0) }
//swift 4.2
nums.allSatisfy(isOdd)

SE-0143條件一致性吵聪,現(xiàn)在可以在擴展(extension)中合成協(xié)議一致性凌那,而不僅僅是在類型定義上(擴展必須仍然位于與類型定義相同的文件中),并且允許自動合成Equatable, Hashable, Encodable, 和 Decodable.


func isEncodable(_ value: Any) -> Bool {
    return value is Encodable
}
let encodableArray = [1, 2, 3]

//Swift 4.1
isEncodable(encodableArray) // false

//Swift 4.2
isEncodable(encodableArray) // true
struct NonEncodable {}
let nonEncodableArray = [NonEncodable(), NonEncodable()]
isEncodable(nonEncodableArray)// false 在不滿足條件一致性條件時吟逝,動態(tài)查驗不成功帽蝶。

enum Either<Left, Right> {
    case left(Left)
    case right(Right)
}

// 擴展后無需寫具體實現(xiàn),編譯器自動合成
extension Either: Equatable where Left: Equatable, Right: Equatable {}
extension Either: Hashable where Left: Hashable, Right: Hashable {}

Either<Int, String>.left(42) == Either<Int, String>.left(42)

SE-0212新增編譯器版本指令

// swift 3
#if swift(>=4.1) || (swift(>=3.3) && !swift(>=4.0))
// Code targeting the Swift 4.1 compiler and above.
#endif

#if swift(>=4.1.50) || (swift(>=3.4) && !swift(>=4.0))
// Code targeting the Swift 4.2 compiler and above.
#endif

#if swift(>=5.0) || (swift(>=4.1.50) && !swift(>=4.2)) || (swift(>=3.5) && !swift(>=4.0))
// Code targeting the Swift 5.0 compiler and above.
#endif

//swift4
#if swift(>=4.1) || (swift(>=3.3) && !swift(>=4.0))
// Code targeting the Swift 4.1 compiler and above.
// 低版本編譯器兼容代碼.
#endif

#if compiler(>=4.2)
// Code targeting the Swift 4.2 compiler and above.
#endif

#if compiler(>=5.0)
// Code targeting the Swift 5.0 compiler and above.
#endif

SE-0210添加MemoryLayout<T>.offset(of:)方法,返回一個指針地址偏移后的T類型的值

// C語言
// Layout of one of our vertex entries
struct MyVertex {
  float position[4];
  float normal[4];
  uint16_t texcoord[2];
};

enum MyVertexAttribute { Position, Normal, TexCoord };

glVertexAttribPointer(Position, 4, GL_FLOAT, GL_FALSE,
                      sizeof(MyVertex), (void*)offsetof(MyVertex, position));
glVertexAttribPointer(Normal, 4, GL_FLOAT, GL_FALSE,
                      sizeof(MyVertex), (void*)offsetof(MyVertex, normal));
glVertexAttribPointer(TexCoord, 2, GL_UNSIGNED_BYTE, GL_TRUE,
                      sizeof(MyVertex), (void*)offsetof(MyVertex, texcoord));
                      
//swift 4.2 
struct Point {
  var x, y: Double
}

struct Size {
  var w, h: Double

  var area: Double { return w*h }
}

struct Rect {
  var origin: Point
  var size: Size
}

MemoryLayout<Rect>.offset(of: \.origin.x) // => 0
MemoryLayout<Rect>.offset(of: \.origin.y) // => 8
MemoryLayout<Rect>.offset(of: \.size.w) // => 16
MemoryLayout<Rect>.offset(of: \.size.h) // => 24
MemoryLayout<Rect>.offset(of: \.size.area) // => nil

SE-0205只讀屬性withUnsafePointer(to:_:)withUnsafeBytes(of:_:) 頂層方法擴展

SE-0196編譯器指令#warning#error

// swift4.2
 #warning("TODO: missing implementation")//編譯器警告
 #error("This playground requires UIKit or AppKit")//編譯失敗報錯

SE-0195動態(tài)成員查找励稳,通過@dynamicMemberLookup聲明屬性 佃乘,以獲取 Python等語言的支持

// Python
class Dog:
   def __init__(self, name):
       self.name = name
       self.tricks = []    # creates a new empty list for each dog
   def add_trick(self, trick):
       self.tricks.append(trick)
       return self
----------------------------------------       
 //swift 4.2
 // import DogModule
 // import DogModule.Dog as Dog    // an alternate
 let Dog = Python.import("DogModule.Dog")
 let dog = Dog("Brianna")
 dog.add_trick("Roll over")
 let cuteDog = Dog("Kaylee").add_trick("snore")

SE-0194遍歷普通枚舉值

enum Terrain: CaseIterable {
    case water
    case forest
    case desert
    case road
}

Terrain.allCases
Terrain.allCases.count

使用CaseIterable后,枚舉可以通過.allCases獲取所有枚舉值的數(shù)組

SE-0193模塊間調(diào)用驹尼, 用@inlinable and @usableFromInline聲明公共接口

// Inside CollectionAlgorithms module:
extension Sequence where Element: Equatable {
    /// Returns `true` iff all elements in the sequence are equal.
    @inlinable
    public func allEqual() -> Bool {
        var iterator = makeIterator()
        guard let first = iterator.next() else {
            return true
        }
        while let next = iterator.next() {
            if first != next {
                return false
            }
        }
        return true
    }
}

[1,1,1,1,1].allEqual()
Array(repeating: 42, count: 1000).allEqual()
[1,1,2,1,1].allEqual()

SE-0054廢除隱式可選類型

let x: Int! = 5   //x:Int趣避!
let y = x         //y:Int?
let z = x + 0     //z:Int

X在使用時被強制解包為Int類型,新翎!聲明的類型表示可選類型程帕,并且告知編譯器可以強制解包[Int!]<T!>等類型將不再可用,類似的自動類型推導(dǎo)也將提示修改為指定類型

XCode 10更新


  1. 多行編輯:control + shift +鼠標單擊

多行編輯在Mac OS10.14中可以在眾多編輯器中使用如Sublime Text3中可以用command+鼠標單擊 點擊多行編輯(支持多行分別復(fù)制粘貼)

linesedit.gif

  1. 為快速查看彈出窗口添加了導(dǎo)出選項地啰,用于數(shù)據(jù)類型愁拭,例如NSData


    屏幕快照 2018-09-19 上午11.04.52.png
  1. 現(xiàn)在,新創(chuàng)建的schemes默認由Xcode項目的所有用戶共享亏吝。要創(chuàng)建個人方案岭埠,請取消選中Manage Schemes表中的Shared復(fù)選框

  2. 打開Library時按住Option鍵將使其在手動關(guān)閉之前保持可見,而不是在每次使用后自動關(guān)閉蔚鸥。(使用command+shift+M/L打開媒體庫或UI組件庫惜论,拖去UI組件時按住Option殼使彈出視圖不消失)

    屏幕快照 2018-09-19 上午11.24.25.png

  3. xcode的10增加了對C ++ 17個頭部的支持<any>,<optional>和<variant>止喷。(39271859)

  4. 命名顏色現(xiàn)在可以象征性地引用系統(tǒng)顏色馆类。(39196638)

  5. libstdc ++已在xcode10棄用,C ++項目現(xiàn)在必須遷移到libc++启盛,開發(fā)人員還應(yīng)審核項目依賴項,以刪除對libstdc++的引用

  6. Libgcc已經(jīng)過時了技羔。Xcode 10無法再構(gòu)建具有macOS 10.4和10.5部署目標的應(yīng)用程序僵闯。(42818150,38035243)

  7. 已刪除對Subversion(SVN)的支持,目前只支持Git

  8. Xcode 10是最后一個支持Swift 3的版本。通過打開項目并選擇Edit> Convert> To Current Swift Syntax ...將項目從Swift 3代碼遷移到Swift 4.2語法...(43101816)

  9. macOS 10.14 SDK不再包含對編譯32位應(yīng)用程序的支持藤滥。如果開發(fā)人員需要為i386編譯鳖粟,則需要Xcode 9.4或更早版本。

  10. 調(diào)試工具增強
    更多信息請閱讀參考文檔中的《Xcode 10 Release Notes》

XCode10已知BUG

  1. 打開存儲在iCloud Drive中的Xcode項目和工作空間拙绊,或更改存儲在iCloud Drive中的打開的工作空間或項目的源控制分支向图,可能會導(dǎo)致Xcode掛起。
  2. 運行iOS 12的設(shè)備可能無法從Xcode的設(shè)備窗口獲取請求的屏幕截圖标沪。(42873539)
    解決方法:在設(shè)備上截取屏幕截圖榄攀。
  3. 使用以前版本的Xcode構(gòu)建的Xcode 10運行WatchKit應(yīng)用程序可能會出現(xiàn)安裝錯誤“WatchKit應(yīng)用程序具有無效的存根可執(zhí)行文件”。(40567857)
    解決方法:清理構(gòu)建文件夾并再次運行應(yīng)用程序金句。
  4. 如果Xcode尚未連接完成任何開發(fā)設(shè)備檩赢,則Instruments可能無法啟動。(43066159)
    解決方法:等待Xcode的設(shè)備設(shè)置階段完成违寞,然后打開Instruments贞瞒。
  5. Instruments可能無法在iOS模擬器中配置庫或框架單元測試
  6. 在playground中切換到非默認工具鏈可能會導(dǎo)致Xcode崩潰偶房。(43659135)
    解決方法:切換回默認工具鏈,然后打開playground军浆。
  7. 模擬設(shè)備中的macOS粘貼板和粘貼板之間的同步有時會失敗棕洋。(36036706,38052949,41916640)
  8. 操作系統(tǒng)可能需要幾分鐘才能在模擬器中首次啟動。(40535421)
  9. Xcode不支持ed25519加密的SSH密鑰對乒融。(40912136)
    解決方法:使用使用不同加密形式的SSH密鑰對掰盘。

參考文檔

1.whats-new-in-swift-4-2
2.swift change Log
3.swift-4-2-released
4.Xcode 10 Release Notes

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市簇抵,隨后出現(xiàn)的幾起案子庆杜,更是在濱河造成了極大的恐慌,老刑警劉巖碟摆,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晃财,死亡現(xiàn)場離奇詭異,居然都是意外死亡典蜕,警方通過查閱死者的電腦和手機断盛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愉舔,“玉大人钢猛,你說我怎么就攤上這事⌒停” “怎么了命迈?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長火的。 經(jīng)常有香客問我壶愤,道長,這世上最難降的妖魔是什么馏鹤? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任征椒,我火速辦了婚禮,結(jié)果婚禮上湃累,老公的妹妹穿的比我還像新娘勃救。我一直安慰自己,他們只是感情好治力,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布蒙秒。 她就那樣靜靜地躺著,像睡著了一般宵统。 火紅的嫁衣襯著肌膚如雪税肪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音益兄,去河邊找鬼锻梳。 笑死,一個胖子當著我的面吹牛净捅,可吹牛的內(nèi)容都是我干的疑枯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛔六,長吁一口氣:“原來是場噩夢啊……” “哼荆永!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起国章,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤具钥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后液兽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骂删,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年四啰,在試婚紗的時候發(fā)現(xiàn)自己被綠了宁玫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡柑晒,死狀恐怖欧瘪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匙赞,我是刑警寧澤佛掖,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站涌庭,受9級特大地震影響芥被,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脾猛,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一撕彤、第九天 我趴在偏房一處隱蔽的房頂上張望鱼鸠。 院中可真熱鬧猛拴,春花似錦、人聲如沸蚀狰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽麻蹋。三九已至跛溉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芳室。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工专肪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堪侯。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓嚎尤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親伍宦。 傳聞我的和親對象是個殘疾皇子芽死,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354