一健蕊,Swift 介紹
Swift 是一門由蘋果公司于2014年WWDC 蘋果開發(fā)者大會上發(fā)布的新的開發(fā)語言恰起,可與Objective-C*共同運(yùn)行于Mac OS和iOS平臺燃少,用于搭建基于蘋果平臺的應(yīng)用程序终蒂。
其優(yōu)點(diǎn):Swift 有類似 Python 的易用性恬吕,又有較強(qiáng)的運(yùn)行效率签则。既有Objective C的運(yùn)行時(shí)動態(tài)支持,和基于編譯期引用計(jì)數(shù)的內(nèi)存管理模型铐料,又具備Ruby靈活優(yōu)雅的語法渐裂,C++的嚴(yán)格編譯期檢查、Javascript和Ruby的closure钠惩。Swift還支持與Objective C 混編柒凉,完美支持IOS/Mac 的SDK。
歷史版本:
Swift 4.1
is available as part of Xcode 9.3.
Swift 4.0.3
Swift 4.0.2
Swift 4.0
Swift 3.1.1
Swift 3.1
Swift 3.0.2
Swift 3.0.1
Swift 3.0
Swift 2.2.1
Swift 2.2
二篓跛,簡單示例代碼
print(“Hello, world!”)膝捞、
1,變量和常量
使用 let來聲明一個(gè)常量愧沟,用 var來聲明一個(gè)變量蔬咬。常量的值在編譯時(shí)并不要求已知,但是你必須為其賦值一次沐寺。這意味著你可以使用常量來給一個(gè)值命名林艘,然后一次定義多次使用。
var myVariable = 42
myVariable = 50
let myConstant = 42
2混坞,控制流
使用 if和 switch來做邏輯判斷狐援,使用 for-in, for究孕, while啥酱,以及 repeat-while來做循環(huán)。使用圓括號把條件或者循環(huán)變量括起來不再是強(qiáng)制的了蚊俺,不過仍舊需要使用花括號來括住代碼塊懈涛。
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score>50{
teamScore+=3
}else{
teamScore+=1
}
}
print(teamScore)
3,函數(shù)和閉包
使用 func來聲明一個(gè)函數(shù)泳猬。通過在名字之后在圓括號內(nèi)添加一系列參數(shù)來調(diào)用這個(gè)方法。使用 ->來分隔形式參數(shù)名字類型和函數(shù)返回的類型宇植。
func greet(person: String, day: String) -> String {
return"Hello\(person), today is\(day)."
}
greet(person: “Bob”, day: “Tuesday”)
4得封,對象和類
通過在 class后接類名稱來創(chuàng)建一個(gè)類。在類里邊聲明屬性與聲明常量或者變量的方法是相同的指郁,唯一的區(qū)別的它們在類環(huán)境下忙上。同樣的,方法和函數(shù)的聲明也是相同的寫法闲坎。
class Shape {
var numberOfSides = 0
func simpleDescription()->String{
return"A shape with\(numberOfSides)sides."
}
}
5疫粥,枚舉和結(jié)構(gòu)體
使用 enum來創(chuàng)建枚舉茬斧,類似于類和其他所有的命名類型,枚舉也能夠包含方法梗逮。
enum Rank:Int {
case ace = 1
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
func simpleDescription()->String{
switch self{
case.ace:
return"ace"
case.jack:
return"jack"
case.queen:
return"queen"
case.king:
return"king"
default:
return String(self.rawValue)
}
}
}
init() {
let ace = Rank.ace
let aceRawValue = ace.rawValue
}
6项秉,協(xié)議和擴(kuò)展
使用 protocol來聲明協(xié)議。
protocol ExampleProtocol {
var simpleDescription:String{get}
func mutatingfuncadjust()
}
類慷彤,枚舉以及結(jié)構(gòu)體都兼容協(xié)議娄蔼。
protocol ExampleProtocol {
var simpleDescription:String{get}
func adjust()
}
class SimpleClass:ExampleProtocol {
var simpleDescription:String="A very simple class."
var anotherProperty:Int=69105
func adjust(){
simpleDescription += " Now 100% adjusted."
}
}
struct SimpleStructure: ExampleProtocol {
var simpleDescription:String="A simple structure"
func adjust(){
// Left side of mutating operator isn't mutable: 'self' is immutable
}
}
class test {
init() {
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription
}
}
7,錯(cuò)誤處理
你可以用任何遵循 Error協(xié)議的類型來表示錯(cuò)誤底哗。
enum PrinterError: Error {
case outOfPaper
case noToner
case onFire
}
使用 throw來拋出一個(gè)錯(cuò)誤并且用 throws來標(biāo)記一個(gè)可以拋出錯(cuò)誤的函數(shù)岁诉。如果你在函數(shù)里拋出一個(gè)錯(cuò)誤,函數(shù)會立即返回并且調(diào)用函數(shù)的代碼會處理錯(cuò)誤跋选。
func send(job: Int, toPrinter printerName: String) throws -> String {
if printerName == "Never Has Toner"{
throw PrinterError.noToner
}
return"Job sent"
}
有好幾種方法來處理錯(cuò)誤涕癣。一種是使用 do-catch。在 do代碼塊里前标,你用 try來在能拋出錯(cuò)誤的函數(shù)前標(biāo)記属划。在catch代碼塊,錯(cuò)誤會自動賦予名字 error候生,如果你不給定其他名字的話同眯。
do {
let printerResponse = try send(job:1040, toPrinter:"Bi Sheng")
print(printerResponse)
} catch {
print(error)
}
8,泛型
把名字寫在尖括號里來創(chuàng)建一個(gè)泛型方法或者類型唯鸭。
class Item {
var a = "a"
var b = "b"
}
func makeArray(repeating item: Item, numberOfTimes: Int) -> [Item] {
var result = [Item]()
//for _ in 0..
result.append(item)
return result
}
init() {
var item = Item()
makeArray(repeating:item, numberOfTimes:4)
}
你可以從函數(shù)和方法同時(shí)還有類须蜗,枚舉以及結(jié)構(gòu)體創(chuàng)建泛型。
// Reimplement the Swift standard library’s optional type
enum OptionalValue {
case none
case some(Int)
}
init() {
var possibleInteger: OptionalValue = .none
possibleInteger = .some(100)
}
在類型名稱后緊接 where來明確一系列需求——比如說目溉,判斷兩個(gè)數(shù)組中否包含有相同的對象(不是地址相等,是內(nèi)容相等
func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
return true
}
}
}
return false
}
返回獲取相交的數(shù)據(jù)
func anyCommonElements<T: Sequence, U: Sequence >(_ lhs: T, _ rhs: U) -> Array<T.Iterator.Element>
where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element{
var array:[T.Iterator.Element] = Array()
for lhsItem in lhs {
for rhsItem in rhs {
if lhsItem == rhsItem {
array.append(lhsItem)
}
}
}
return array
}
三明肮、學(xué)習(xí)及參考資料
https://developer.apple.com/swift/resources/ // Xcode 9 + Swift 4 下載
1,Apple 官方Swift 學(xué)習(xí)指南(英文) The Swift Programming Language (Swift 4.1)
2缭付,一份翻譯比較完整的中文版Swift 學(xué)習(xí)指南
3柿估,Swift 評價(jià):
https://www.zhihu.com/question/24002984
4,一個(gè)Objective C 代碼 轉(zhuǎn) Swift 代碼的在線網(wǎng)站
https://objectivec2swift.com/#/converter/
其他參考及學(xué)習(xí)資料:
http://www.reibang.com/p/f35514ae9c1a
http://www.reibang.com/p/805be373eded
http://www.reibang.com/p/563738348597
https://swift.org/download/#releases