下面這些代碼可以在playground中展現出來
import UIKit
/* 實例化一個 UIView 的對象,保存在堆中
[[UIView alloc] initWithXXX:xxx] 所有 OC中以這種格式的實例化方法,在 swift 中都可以使用 類(XXX:)*/
let view = UIView(frame: CGRectMake(0, 0, 100, 100))
view.backgroundColor = UIColor.orangeColor()
// 在這裏修改的是 view 的屬性,並沒有修改 view 本身的地址
let btn = UIButton(frame: CGRectMake(20, 20, 60, 60))
btn.setTitle("hello", forState: UIControlState.Normal)
view.addSubview(btn)
/*
實際的應用技巧
*/
// ? 表示 可以有值(NSString),也可以沒有值(nil)
// ? 如果對象爲空,就不會調用後面的方法,感覺上和 oc 中給 nil 發送消息類似
var str: NSString?
str = "hello"
// 打印可選項的時候,同時會輸出一個 Optional,提示開發者,這是一個可選項
println(str?.length)
//println(str!.length)
let l = 10
// 目前的代碼存在什麼風險?如果 str 沒有設置初始值,會直接崩潰
// 蘋果把判斷對象是否有內容的工作交給了程序員
//let len = l + str!.length
// 隆重推薦:?? 用來快速判斷對象是否爲 nil
let len2 = l + (str?.length ?? 0)
// 以下代碼和上面的代碼等效
if str != nil {
let len3 = l + str!.length
}
// ?? 的應用場景最多的就在tableView 的數據源方法
/*
for 循環
*/
// 傳統的寫法,幾乎一樣
// 注意:需要使用 var 而不是 let
for var i = 0; i < 10; i++ {
println(i)
}
// 更加方便的寫法
// in 指定範圍 0~9
// 早期的 swift 語法 .. 後來改成了 ..<
for i in 0..<10 {
println(i)
}
// 0~10
for i in 0...10 {
println(i)
}
// 如果遍歷的時候,對索引下標不關注
// 其實 `_` 在 swift 中,使用的非常廣泛,主要用於忽略
for _ in 0...5 {
println("hello")
}
/*
字符串
*/
/**
在swift中,字符串默認的類型是 String,而不是 NSString
* swift中 String 是一個結構體,的效率更高
* 支持快速遍歷
* NSString,繼承自 NSObject,是一個 OC 對象
* 不支持快速遍歷
*/
var str1 = "Hello, 大家一起飛"
// 對字符串的快速遍歷
for c in str1 {
println(c)
}
// 字符串的拼接
let str2 = str1 + " hello"
let i = 100
println(str1 + " \(i) abc \(view.backgroundColor)")
let frame = CGRectMake(100, 100, 200, 300)
println("區域 \(frame)")
// 但是:如果需要格式怎麼辦? NSString.stringWithFormat
let str3 = String(format: "%02d:%02d:%02d", arguments: [1, 5, 10])
/**
在 swift 中,如果要結合 range 一起使用 字符串,建議先轉成 NSString 再處理
*/
let myString: NSString = "hello"
myString.substringWithRange(NSMakeRange(1, 4))
// 蛋疼的使用 String & Range -> 取子串
//let subStr = myString.substringWithRange(Range<String.Index>(start: advance(str.startIndex, 1), end: advance(str.startIndex, 3)))
/*
數組
*/
// 使用 []
// 定義的數組類型是 [String]
// 表示數組中,只能存放 字符串
// 在 oc 中的數組,分可變和不可變
// swift中 let 是不可變的, var 是可變的
let array1 = ["zhangsan", "lisi"]
// 遍歷數組
for a in array1 {
let str = "hello " + a
println(str)
}
// 不能向不可變數組中追加元素
//array1.append("abc")
var array2 = ["aaa", "bbb"]
// 添加元素
array2.append("ccc")
// 如果定義數組時,指定的對象類型不一致
// 定義的數組類型是 [NSObject]
// 細節:11是一個整數,在 OC 中,如果要向數組中添加數字,需要轉換成 NSNumber
// swift 中,可以直接添加 - 萬物皆對象!
// 細節:通常在開始時,不建議在數組中使用不同類型的數據
var array3 = ["zzz", 11, "123"]
for a in array3 {
let str = "hi \(a)"
println(str)
}
/*
字典
*/
// 定義一個字典,仍然使用 []
// 以下代碼定義的字典類型是:[String : NSObject]
// 在目前的 swift 版本中,定義字典通常使用 [String : NSObject]
// 大多數情況下,key的類型是固定的
let dict = ["name": "zhangsan", "title": "boss", "age": 18]
// 遍歷字典(注意:k, v 可以隨便寫,但是,前面是 key, 後面是 value)
// 這裏使用了swift中的元祖技巧
for (kk, vv) in dict {
println("\(kk) -- \(vv)")
}
// 定義並且實例化字典
var dict1 = [String: NSObject]()
// 設置內容
dict1["name"] = "laowang"
dict1["age"] = 80
dict1
// 注意:如果 key 已經存在,設置數值時,會覆蓋之前的值
dict1["name"] = "abc"
dict1
// 刪除內容
dict1.removeValueForKey("age")
dict1
// 合併字典
var dict2 = ["title": "boss"]
dict2["name"] = "wangxiaoer"
// 字典的特性:key是不允許重複的
// 利用循環來進行合併
// 1> 遍歷 dict2
for (k, v) in dict2 {
// updateValue 更新指定 key 的 value
// 如果不存在 key,會新建,並且設置數值
// 如果存在 key,會直接覆蓋
dict1.updateValue(v, forKey: k)
}
dict1
dict2
/*
`函數`
*/
// OC 的 風格 - (void)函數名(參數) {}
/**
函數定義格式
func 函數名(參數列表) -> 返回值 {// 代碼實現}
* -> 是 swift 特有的,表示 前面的執行結果,輸出給後面的
*/
func sum(a: Int, b: Int) -> Int {
return a + b
}
sum(10, 20)
// 強制填寫參數,使用 #,可以在調用的時候,增加參數
// 會讓代碼提示更直觀,符合 OC 程序員的習慣
func sum1(#a: Int, #b: Int) -> Int {
return a + b
}
sum1(a: 20, b: 80)
// 如果沒有返回值 `-> 返回值` 可以省略
/**
-> Void
-> ()
完全省略
以上三個是等價的
*/
func demo(a: Int) -> () {
println(a)
}
demo(10)