Swift 簡介
先貼上一段官網(wǎng)對Swift的介紹
Swift is a powerful and intuitive programming language for macOS, iOS, watchOS and tvOS. Writing Swift code is interactive and fun, the syntax is concise yet expressive, and Swift includes modern features developers love. Swift code is safe by design, yet also produces software that runs lightning-fast.
我總結就是簡單,安全,快。
使用Object-C開發(fā)App已經(jīng)兩年了。其實很容易感覺到Object-C這種語言有相當多的缺點。其中感覺最明顯的一點就是函數(shù)的命名問題。用Object-C的函數(shù)名字太長了,看起來非常地冗余。經(jīng)常會出現(xiàn)一些函數(shù)命名是需要多行來顯示的。Swift的語法比Object-C簡潔了非常多。并且借鑒了許多其它語言的優(yōu)點,加入了大量的語法糖。學習起來會覺得比較有趣。
關于安全。我現(xiàn)在能體會到Swift比較安全的只有一點,那就是舍棄了null而使用Optional語法。Optional在理解Swift語法中是非常重要的,在之后會詳細地說明。
基礎語法與特性
變量與常量
使用var聲明變量,使用let聲明常量。
如果如下嘗試改變用let聲明的變量,編譯器就會報錯:"Cannot assign value: 'str' is a 'let' constant
let str = "String"
str = "String 2"
類型推斷
看到上面的變量聲明之后,你可能會覺得Swift和JavaScript一樣是一種弱類型的語言。但其實Swift是強類型的語言。上面的變量聲明還可以是這樣:
let str: String = “String”
其中String就是變量的類型。上面的:String 之所以可以省略是因為后面給變量str賦值了一個String類型的常量。所以編譯器能夠推斷出str也是String類型的。
類和函數(shù)
class FirstClass{
let total : Double
let pro : String
init(total: Double, pro :String) {
self.total = total
self.pro = pro
}
func doSomeThing(param1: String, param2: String) -> String{
print("do something \(str)")
return "over"
}
}
var fc = FirstClass(total: 24,pro: "sddf")
fc.doSomeThing(param1: "Hello",param2: "World")
從上面的代碼可以看到類和函數(shù)是如何定義和使用的。需要注意的是init方法是每個類的構造函數(shù)。不需要前綴func。 函數(shù)的返回值用-> 表示,這個和ES6里面的箭頭函數(shù)是一樣的。另外一個和其它編程語言不同的是,在使用函數(shù)的時候,需要把參數(shù)的名字也加上。如例子中的param1和param2。不過對于這些簡單常見的錯誤,編譯器都能夠檢測出來并且給出推薦如何修改。這是對Swift初學者來說比較好的一件事情。
上面的代碼中還有一段打印的函數(shù):
print("do something \(str)")
這里示范了如何在控制臺打印字符以及如何在字符中包含參數(shù)(使用反斜杠加括號)。
數(shù)組和字典
先看數(shù)組的使用方法:
let arr = [2.0, 4.5, 3.7]
let arrExplicit: [Double]
for i in 0..<arr.count{
print(arr[i])
}
這里有幾點要注意的:
- 數(shù)組常量的使用只需要用中括號里面加數(shù)組的元素;
- 顯式的聲明一個數(shù)組變量,則變量的類型為中括號,里面是每個元素的類型;
- for循環(huán)的條件不需要用括號括起來;
- 0..<3 表示0到3的一個數(shù)組,但不包括3。 0...3會包括3。
數(shù)組的一些API,見文知意:
arr.append(6.3)
arr.remove(at: 3)
arr.insert(10.9, at: 1)
arr.append(contentsOf: [3.5,6.8])
arr[0] = 89.23
arr.reversed()
arr.sort()
字典的顯示聲明:
var dictionary: [String:Int] = [
"one" : 1,
"two" : 2,
"three" : 3
]
賦值一個空的字典:
var emptyDictionary: [Int:Int] = [:]
字典取值:
let value = dictionary["one"]
字典的添加,更新和刪除
var emptyDictionary: [Int:Int] = [:]
emptyDictionary[1] = 12
emptyDictionary.updateValue(14, forKey: 1)
emptyDictionary.removeValue(forKey: 1)
另外需要注意的是,在Swift中,Array和Dictionary是值類型的。所以使用簡單的等號就可以完成拷貝了。不像有些語言還分深拷貝和淺拷貝。
可見數(shù)組與字典的使用都是相當簡潔的。
元組(Tuple)
A tuple is a group of zero or more values represented as one value.
看看代碼大概就知道Tuple是什么了:
var tuple = ("name",12)
var namedTuple = (name:"Name",age:12)
namedTuple.name = "updateName"
其實元組就是一種數(shù)據(jù)結構,里面包含一個或多個值,并且這些值可以是不同類型的。元組中的值可以是命名的也可以是匿名的。如果是命名的,那么可以使用.符號來獲取該值。
那么為什么要有元組這種數(shù)據(jù)結構呢?
可以看下以下的代碼:
func getNameAndAge() -> (String,Int){
return ("Ace",20)
}
在有些情況下我們會需要一個函數(shù)有多個返回值,此時Tuple就非常有用了。
枚舉類型(Enum)
聲明與使用:
enum iOSDeviceType {
case iPhone
case iPad
case iWatch
}
var myDevice = iOSDeviceType.iPhone
當變量的類型已經(jīng)明確時,賦值可以簡化為:
var myDevice: iOSDeviceType
myDevice = .iPhone
raw value
每個枚舉都可以擁有自己的一個原生類型的raw value,所有的枚舉關聯(lián)的raw value必須是同一個類型的。當類型是Int時,默認按照枚舉值的順序遞增其raw value。
enum Direction: Int {
case Up = 1
case Down // will have the raw value 2
case Left // will have the raw value 3
case Right // will have the raw value 4
}