WWDC2016 Session 402 - What’s New in Swift

Swift 開源已有6個(gè)月杠览,開源社區(qū)討論從未停歇過惜论。Swift3 的目標(biāo)有以下4點(diǎn):

  1. 發(fā)展開源社區(qū)
  2. 新平臺(tái)的可移植性(目前面向macOS和Ubuntu)
  3. 開放更多基礎(chǔ)功能
  4. 持續(xù)優(yōu)化

前往Swift.org 了解更多屏歹。

Swift 在 Apple 中的普及率

目前公布的 Sierra macOS 系統(tǒng)中篓跛,大部分 Misson Control 都已經(jīng)使用 Swift 重寫畸陡,甚至 Accessibility 引擎完全使用了 Swift鸣哀。

Ted Kremenek 以 Dock 為例架忌,講述關(guān)于這個(gè)20萬行代碼的應(yīng)用使用 Swift 重寫后代碼量減少了15%之多,同時(shí)又增加了一些新功能我衬。

GitHub 上的 Swift

眾所周知叹放,Apple 開源了 Swift饰恕,將項(xiàng)目托管到了 GitHub,項(xiàng)目有很多井仰,譬如:swift懂盐、swift-evolution、swift-package-manager糕档、swift-clang莉恼、swift-corelibs-libdispatch等等。不過實(shí)際可以劃分為三類:

  • Language:swift swift-evolution
  • Package Manager:swift-package-manager swift-llbuild
  • Core Libraries:swift-corelibs-xctest swift-corelibs-foundation swift-corelibs-libdispatch

更多請前往 GitHub 了解更多速那。

如果你想要對 swift 提出自己的想法或意見俐银,這意味著 evolution,Apple 十分歡迎開發(fā)者踴躍參與端仰,但是貌似國內(nèi)很多小伙伴不是很了解捶惜。大致流程是:

  • 郵件交流,講述你的想法荔烧,如何改動(dòng)吱七。
  • 以 pr 方式提交你的建議。
  • 一旦接受鹤竭,開始review踊餐。
  • 郵件列表中review,比較正式臀稚。
  • 開發(fā)團(tuán)隊(duì)決斷吝岭,打回or接受。

這里提供提案的列表吧寺,目前有102個(gè)窜管,有興趣可以看看,實(shí)時(shí)關(guān)注swift的動(dòng)態(tài)稚机。

關(guān)于 swift 的改動(dòng)

Swift 3 的核心任務(wù)或者說是目標(biāo)是提高兼容性幕帆,這對于跨平臺(tái)開發(fā)至關(guān)重要。不僅是針對 Swift3赖条,亦包括 Swift4.0 版本失乾。

下面根據(jù)視頻簡單羅列一些:

命名準(zhǔn)則

API 設(shè)計(jì)準(zhǔn)則中重要幾點(diǎn):

  • 一目了然,而非過分簡潔或冗余谋币。
  • 突出重要信息
  • 省略冗余信息

更多請見Api-design-guidelines仗扬,貌似 Swift.gg 已經(jīng)有中文版了哦。

舉例:

swift 2

/// Swift.Array
array.appendContentsOf([2,3,4])
array.insert(1, atIndex: 0)

/// Foundation.NSURL
if url.fileURL {}
x = url.URLByAppendingPathComponent("file.txt")

swift3

/// Swift.Array
array.append(contentsOf: [2,3,4]) // 作為標(biāo)簽存在更加清晰
array.insert(1, at: 0) // index 沒有存在的意義

/// Foundation.NSURL
if url.isFileURL {} // 這里平常都會(huì)用到吧
x = url.appendingPathComponent("file.txt")// 都已經(jīng)是URL 何必加 URLBy前綴呢

很明顯改進(jìn)后調(diào)用意圖不變蕾额,但是精簡了很多早芭。

Objective-C API 和 Swift 橋接問題

這里推薦 swift.gg 的SE-0005 更好的把 Objective-C APIs 轉(zhuǎn)換成 Swift 版本

簡單舉例:

swift2

// oc
void CGContextFillPath(CGContextRef);//這是Core Graphic 畫圖庫中的函數(shù)诅蝶!不是方法
// import 調(diào)用API變成如下 還是一個(gè)函數(shù)
func CGContextFillPath(_: CGContext)

swift3

// oc
void CGContextFillPath(CGContextRef)
           NS_SWIFT_NAME(CGContext.fillPath(self:));// 注意NS_SWIFT_NAME修飾符
// 對 CGContext 擴(kuò)展
extension CGContext {
  func fillPath()
}

在說說泛型:

swift2

func findAnimals() {
  let request = NSFetchRequest(entityName:”Animal")
  guard let searchResults =
           try? context.executeFetchRequest(request) as! [Animal] {
    return
  }
  ...
  use(searchResults)
}

swift3

func findAnimals() {
  let request : NSFetchRequest<Animal> = Animal.fetchRequest 
  guard let searchResults = try? context.fetch(request) {
    return
  }
  ...
  use(searchResults)
}

旨在實(shí)例化一個(gè)對名為 Animalentity 請求退个,以前的寫法是構(gòu)造函數(shù)募壕,而新的是上述這種方式,已驚呆语盈。

// oc 
typedef NSString *NSNotificationName; // 對 NSString 設(shè)置別名
const NSNotificationName NSUserDefaultsDidChangeNotification; // 變量A

// swift 導(dǎo)入
let NSUserDefaultsDidChangeNotification: String // oc變量A在swift中 實(shí)際就是String類型嘛

// 使用
center.addObserver(forName: NSUserDefaultsDidChangeNotification, ...) // 冗長

swift3

typedef NSString *NSNotificationName NS_EXTENSIBLE_STRING_ENUM; // 注意修飾詞 變成了一個(gè)枚舉值.....
const NSNotificationName NSUserDefaultsDidChangeNotification;

// swift 導(dǎo)入
extension UserDefaults {
  class let didChangeNotification: NSNotification.Name
}

// 使用1
center.addObserver(forName: UserDefaults.didChangeNotification, ...)
// 使用2
center.addObserver(forName: .didChangeNotification, ...)

核心語言

函數(shù)參數(shù)標(biāo)簽的一致性

swift2

func myFunction(a: Int, b: Int, c: Int) { } 
myFunction(42, b: 57, c: 99)// 沒有 a 標(biāo)簽名

swift3

func myFunction(a: Int, b: Int, c: Int) { } 
myFunction(a: 42, b: 57, c: 99)

這個(gè)改動(dòng)應(yīng)該很早就提及過舱馅。如果你不是很愿意顯示參數(shù)標(biāo)簽,用 _ 忽略吧刀荒。

不知道大家對 where 這個(gè)條件語句用的多不多代嗤,swift3 也做出了些許改動(dòng),主要是在放置位置上缠借。

swift2

func anyCommon<T: Sequence, U: Sequence
               where T.Element: Equatable,
                     T.Element == U.Element
               >(lhs: T, rhs: U) -> Bool {}

注意我們的函數(shù)名和參數(shù)列表之間摻雜了太多語句了干毅!

swift3

func anyCommon<T: Sequence, U: Sequence>(lhs: T, rhs: U) -> Bool 
          where T.Element: Equatable, T.Element == U.Element {}

在我們寫完函數(shù)定義之后再寫限制條件 where。很nice!

再來看看對未使用變量的處理

swift2

func plusOne(_ a: Int) -> Int {
  return a+1
}
plusOne(x)// 發(fā)出??警告泼返,因?yàn)檫@個(gè)函數(shù)是有返回值

swift3

@discardableResult
func plusOne(_ a: Int) -> Int {
  print(a)     // side effect!
  return a+1
}
plusOne(x)
_ = plusOne(x)

注意@discardableResult 修飾符硝逢。

Swift3 移除的特性

移除東西可能讓你惶恐不安,但是這也是蘋果深思熟慮绅喉,權(quán)衡眾多開發(fā)者提出的意見之后做出的決定渠鸽。目的有三:

  • 致力于簡化語言
  • 減少代碼上手難度
  • 向其他語言學(xué)習(xí),取其精華柴罐,去其糟粕

目前有哪些移除了的呢徽缚?

  • SE-0002 Currying func declaration syntax
  • SE-0003 函數(shù)參數(shù)列表中的 var
  • SE-0004 ++ 和 -- 運(yùn)算符
  • SE-0007 C 語言中的 for 循環(huán)

又有哪些新加入的呢?

  • SE-0025 加入 fileprivate 作用域范圍丽蝎,咱們用的比較多的是 public private
  • SE-0043 case 標(biāo)簽的值綁定操作
  • SE-0048 泛型別名猎拨,貌似是associatedType

其他還有 SE-0062 SE-0064 SE-0068 SE-0075 SE-0092屠阻,不妨去 GitHub 上一睹為快吧。

修改又有哪些呢额各?

  • SE-0028 #file 替換了 FILE
  • SE-0031 inout 變成了類型的一部分
  • SE-0040 屬性語法: :替換=
  • SE-0049 @noescape@autoclosure 可以類型屬性
  • SE-0060 dynamicType 不再是屬性 而是運(yùn)算符国觉。

類型系統(tǒng)的改變

先看一則 swift2 的例子:

let ptr : UnsafeMutablePointer<Int> = nil
if ptr != nil {
   ptr.memory = 42
}

而在swift3 中則是這樣干

let ptr : UnsafeMutablePointer<Int>? = nil 
ptr?.memory = 42

Imported C pointers in APIs obey _Nullable and _Null_unspecified
Consistency: nil is dedicated to Optional and ImplicitlyUnwrappedOptional

隱式解包可選類型(IUO Implicitly Unwrapped OptionaL)

swift2 中類型系統(tǒng)是這么推斷的:

func f(value : Int!) {
  let x = value + 1  // x: Int - 強(qiáng)制解包的結(jié)果
  let y = value      // y: Int!
  let array = [value, 42] // [Int], [Int!], [Int?], [Any]... 它無法推斷類型了 因?yàn)樗恢纘到底是有值呢還是nil呢
   use(array) //Cannot convert value of type ‘[Int!]’ to argument type
}

swift3 中類型系統(tǒng)就聰明很多了:

func f(value : Int!) {
  let x = value + 1  // x: Int - 強(qiáng)制解包的結(jié)果
  let y = value      // y: Int?
  let array = [value, 42] // [Int?], 
   use(array) 
}

浮點(diǎn)數(shù)和數(shù)字

直接上代碼:

/// swift2
let v = 2 * Float(M_PI)
return x * CGFloat(M_PI) / 180

/// swift3
let v = 2 * Float.pi
return x * CGFloat.pi / 180
return x * .pi / 180      // amazing!

更多

之后是關(guān)于 Swift Tools 的簡單介紹虾啦,基本就是說提升了多少性能麻诀,提供了swift2.2->swift2.3 swift2.2->swift2.3的轉(zhuǎn)換方式,可以選擇編譯優(yōu)化傲醉,速度更快蝇闭,以及提示更加智能。這里不一一稱述硬毕∩胍基本來看這個(gè)視頻只不過是概括性地講了下改動(dòng),沒有具體講到某個(gè)細(xì)節(jié)吐咳。所以嘍逻悠,只能作為開胃菜吃著先元践,更多請見專題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末童谒,一起剝皮案震驚了整個(gè)濱河市单旁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饥伊,老刑警劉巖象浑,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異琅豆,居然都是意外死亡融柬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門趋距,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粒氧,“玉大人,你說我怎么就攤上這事节腐⊥舛ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵翼雀,是天一觀的道長饱苟。 經(jīng)常有香客問我,道長狼渊,這世上最難降的妖魔是什么箱熬? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狈邑,結(jié)果婚禮上城须,老公的妹妹穿的比我還像新娘。我一直安慰自己米苹,他們只是感情好糕伐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蘸嘶,像睡著了一般良瞧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上训唱,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天褥蚯,我揣著相機(jī)與錄音,去河邊找鬼况增。 笑死赞庶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尘执,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼舍哄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了誊锭?” 一聲冷哼從身側(cè)響起表悬,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丧靡,沒想到半個(gè)月后蟆沫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡温治,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年饭庞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熬荆。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舟山,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卤恳,到底是詐尸還是另有隱情累盗,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布突琳,位于F島的核電站若债,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拆融。R本人自食惡果不足惜蠢琳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镜豹。 院中可真熱鬧傲须,春花似錦、人聲如沸逛艰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽散怖。三九已至,卻和暖如春肄渗,著一層夾襖步出監(jiān)牢的瞬間镇眷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工翎嫡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欠动,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像具伍,于是被迫代替她去往敵國和親翅雏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容