Swift 開源已有6個(gè)月杠览,開源社區(qū)討論從未停歇過惜论。Swift3 的目標(biāo)有以下4點(diǎn):
- 發(fā)展開源社區(qū)
- 新平臺(tái)的可移植性(目前面向macOS和Ubuntu)
- 開放更多基礎(chǔ)功能
- 持續(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è)對名為 Animal
的 entity
請求退个,以前的寫法是構(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é)吐咳。所以嘍逻悠,只能作為開胃菜吃著先元践,更多請見專題。