標籤:
變數與常量
Swift使用var聲明變數,let聲明常量。
var myVariable = 42myVariable = 50let myConstant = 42 //myConstant不能修改
類型推導
Swift支援類型推導(Type Inference),所以上面的代碼不需指定類型,如果需要指定類型:
var str: String = "Swift"var str = "Swift" //自動推斷類型為String
Swift的變數一旦聲明了,就不能修改類型了,上面的例子中str只能是字串類型,之後無論如何賦值都不能修改其類型。
所以我們說類型往往可以省略,但有些地方還是不能省略。特別是在集合類型上面,例如一個本來想放NSObject的字典,因為初始化用的字串,就被推斷成一個完全都是字串的字典了。
有一個奇葩的地方,Swift 可以用任意Unicode字元當做變數名,也就是說,中文,圖釋,都是可以的。
var 中文 = "swift"var ?? = "haha"
字串String
注意這裡產生的String,並不是NSString。他甚至都不是一個Object,我們可以在定義裡面看到:
struct String { init()}
String和CFString一樣,他是一個Struct! 不過String可以和NSString互相替代,而且API通用。
數組和字典
Swift使用[]操作符聲明數組(Array)和字典(Dictionary):
var shoppingList = ["catfish", "water", "tulips", "blue paint"]shoppingList[1] = "bottle of water"var occupations = [ "Malcolm": "Captain", "Kaylee": "Mechanic",]occupations["Jayne"] = "Public Relations"// 一般使用初始化器(initializer)文法建立空數組和空字典:let emptyArray = String[]()let emptyDictionary = Dictionary<String, Float>()// 如果類型資訊已知,則可以使用[]聲明空數組,使用[:]聲明空字典。
Array和String一樣,也是結構體。不過,Array不具有NSArray的API特性。需要顯示轉換成NSArray才可以調用其方法。
枚舉
通過迴圈枚舉,即
30 while flag {enum(arr)} 31 for a in arr {} 32 for var i=1;i<13;++i {} 33 for i in 1..10 {}
控制流程
Swift的條件陳述式包含if和switch,迴圈語句包含for-in、for、while和do-while,迴圈/判斷條件不需要括弧,但迴圈/判斷體(body)必需括弧:
let individualScores = [75, 43, 103, 87, 12]var teamScore = 0for score in individualScores { if score > 50 { teamScore += 3 } else { teamScore += 1 }}
單路分支
在 if 語句中,條件必須是一個布林運算式
77 if blablabla { 78 } 79 else{ 80 } 注意:這裡的大括弧不可以省略。 多路分支81 switch num 82 { 83 case 1: 84 85 case 2: 86 87 default:
}
注意:不再需要寫break,且default必須有!且必須所有條件都要覆蓋到,一般情況下都會有default,但是若在enum中使用,就可以用case搞定了。
對於case來說,不僅可以寫 case 1, case 2, 還可以寫 case 1, 2, 3, 4, 甚至 case, 1, 2, 3, 4, 7..10
可空類型
結合if和let,可以方便的處理可空變數(nullable variable)。對於空值,需要在型別宣告後添加?顯式標明該類型可空。
var optionalString: String? = "Hello"optionalString == nilvar optionalName: String? = "John Appleseed"var gretting = "Hello!"if let name = optionalName { gretting = "Hello, \(name)"}
? 表示的是:Optional。寫法如下:
var possibleValue: Int? = animalLegs["xiaohaha"]
1 if possibleValue {
2 println("Notnil")
3 }
4 else {
5 println("111")
6 }
!的作用就是突破Optional,拿到內部值62 if possibleValue { 63 let value = possibleValue! 64 println("xiaohaha has \(value) legs") 65 } 66 else { 67 println("> <") 68 } 不過這裡,有個簡練的寫法,更漂亮優雅。69 if let value = possibleValue 70 { 71 println("xiaohaha has \(value) legs") 72 } 73 else 74 { 75 println("> <") 76 }
//如果變數的可選值是 nil,條件會判斷為 false,大括弧中的代碼會被跳過。如果不是 nil,會 將值賦給 let 後面的常量,這樣代碼塊中就可以使用這個值了。
其他迴圈
for-in除了遍曆數組也可以用來遍曆字典:
let interestingNumbers = [ "Prime": [2, 3, 5, 7, 11, 13], "Fibonacci": [1, 1, 2, 3, 5, 8], "Square": [1, 4, 9, 16, 25],]var largest = 0for (kind, numbers) in interestingNumbers { for number in numbers { if number > largest { largest = number } }}largest
while迴圈和do-while迴圈:
var n = 2while n < 100 { n = n * 2}nvar m = 2do { m = m * 2} while m < 100m
Swift支援傳統的for迴圈,此外也可以通過結合..(產生一個區間)和for-in實現同樣的邏輯。
var firstForLoop = 0for i in 0..3 { firstForLoop += i}firstForLoopvar secondForLoop = 0for var i = 0; i < 3; ++i { secondForLoop += 1}secondForLoop
Swift語言概覽