- 創(chuàng)建對象: '
- OC: alloc / initWithXXX
- Swift: (XXX:)
- 調方法
- OC [UIColor redColor];
- Swift: UIColor.redColor()
- 枚舉:
- OC: UIButtonTypeContactAdd
- Swift: UIButtonType.ContactAdd
- 創(chuàng)建結構體:
- OC CGPointMake()
- Swift : CGPoint()
常量和變量
- 以前在OC中的數據類型首字母要大寫肮街,比如Int/Float
- 常量用let风题,注意只能初始化一次
- Swift中盡量推薦用let,只有需要修改變量的時候才用var
let num : Int
num = 33
let num2 : Int = 44
var value : Double
value = 22.3
var value2 : Double = 33.33
- 自動類型推導:如果在定義的同時初始化,那么可以不用寫數據類型沛硅,編譯器會根據內容自動推導出當前的數據類型:
var num = 22.3
- 數據類型轉換:必須手動顯式轉換.Swift中永遠不會自動轉換(強語言)眼刃。CGFloat和Double之間也必須轉換
var n1 = 10.1
var n2 = 10
var sum = n1 + n2 // 這么寫是錯的,OC中會隱式轉換摇肌,Swift中不會
var sum = n1 + Double(n2) // 必須這么寫
分支
- if:swift中可以省略if后面的圓括號擂红。OC中如果大括號中只有一條語句,可以省略大括號围小,swift中不行
let num = 10
if num == 10
{
print("num是10")
}
- Swift中提供了真正的BOOL類型:true/false昵骤。if后面的條件表達式必須是true/false。用到這里肯适,最直接的改變以前的
if (num) {}
這么寫是錯的了
- switch:同樣可以省略switch后面的圓括號变秦。可以不用寫break
- switch在OC中想在case后面定義變量框舔,必須加大括號蹦玫,而swift中不需要
- switch在OC中defult可以隨便放在哪里,或者不用謝雨饺,swift中必須放在最后一條钳垮,而且大部分情況下必須寫
三目運算符
- 注意運算符之間需要有空格惑淳。
大括號如果不換行额港,前面也要有空格
let num = 10
let res = (num == 10) ? 10 : 5
可選類型Optional ? 歧焦!看到問號或者感嘆號那么說明是可選類型
- 含義:可以有值移斩,也可以沒有值。只有可選類型才可以賦值nil
- alt+單擊該變量绢馍,可以發(fā)現(xiàn)它的類型后面有個問號
?
所以如果一個變量如果點開看沒有問號向瓷,那么表示它一定有值
- 如果打印這個類型,那么會在前面自動加個Optional
- 如果不想要Optional舰涌,可以在變量后面加個!,代表告訴系統(tǒng)該變量一定有值猖任,就不會加Optional(稱為強制解包)注意如果對nil執(zhí)行了強制解包,那么會引發(fā)運行時錯誤
let url = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
print(url)
print(url!)
let url1 = NSURL(string:"[http://www.520it.com/哈哈")](http://www.520it.com"))
print(url!)// 此處會崩瓷耙,因為url1后面有中文朱躺,導致url1為nil,對nil強制解包會崩
- 所以一般在強制解包前作個判斷是否為空
if url != nil
可選綁定
- 每次強制解包前還要作判斷搁痛,太麻煩长搀,所以swift提供了可選綁定
- 格式:
let url = NSURL(string:"[http://www.520it.com/哈哈")](http://www.520it.com"))
if url2 = url{ print(url2) // 這里不會打印,因為url為nil鸡典,上面的if會過濾掉
}
let url3 = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
if url4 = url{ print(url2) // 這里會打印源请,而且不帶Optional,系統(tǒng)會自動解包
}
guard守護
- 可先綁定寫得多了,會導致判斷太多(if套if)可讀性差谁尸。用guard來解決這個問題:判斷條件如果為假舅踪,那么執(zhí)行大括號里的,否則繼續(xù)往下走
- 大多數情況用可選綁定症汹,但是注意如果就算有空值硫朦,仍希望代碼繼續(xù)往下走的,要用可選綁定(if完了后面再跟if背镇,不是嵌套)
guard 判斷條件 else{
return
}
- 注意guard大括號里必須要有return或者continue
guard let url2 = url else{
print("url2為空")
return
}
// 能來到這里說明url2肯定有值
print(url2)
自動解包
- 直接這么寫會報錯:因為數據類型不對咬展,前面的變量url是NSURL?類型的
let url : NSURL = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url1 : NSURL? = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url2 : NSURL! = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))
let url3 : NSURL = NSURL(string:"[http://www.520it.com")](http://www.520it.com"))!
- 如果數據類型后面帶了感嘆號了,那么在使用該變量時會自動解包瞒斩。而問號則不會破婆。比如上面打印url2和url3不會帶Optional
- 但是,注意變量后面別隨便帶感嘆號胸囱,因為如果變量為nil祷舀,就會報錯
?烹笔?判斷
- 用于判斷前面的可選類型的參數是否是nil裳扯,如果是nil就返回后面的值
// 這里str是個可選類型
let str: String? = nil
// result不是可選類型(經過?谤职?判斷之后饰豺,肯定有值)
let result = str ?? "123"
print(result)
斷言
- 用于判斷某個變量是否為空,如果為空允蜈,那么直接程序崩潰并且打印信息
assert(access_token != nil, "使用loadUserInfo()方法前必須先授權")
assert(uid != nil, "使用loadUserInfo()方法前必須先授權")
let params = ["access_token": access_token!,
"uid": uid!]
where
- 相當于并且冤吨,寫在可選綁定后面。在這里可以拿到本句代碼中定義的常量饶套。(用&&拿不到)
if let sourceStr: NSString = status?.source where sourceStr != ""
{
let startIndex = sourceStr.rangeOfString(">").location + 1
let length = sourceStr.rangeOfString("<", options: NSStringCompareOptions.BackwardsSearch).location - startIndex
let rest = sourceStr.substringWithRange(NSMakeRange(startIndex, length))
sourceLabel.text = "來自\(rest)"
}
循環(huán)
- 常規(guī)寫法:可以省略圓括號漩蟆。注意空格不要少
for var i = 0;i < 10;i ++
{
print(i)
}
for item in ["1","2","3"]
{
print(item)
}
- swift特有寫法:其中
0..<10
稱之為半閉區(qū)間。
- 半閉區(qū)間:不包含頭妓蛮,包含尾
- 閉區(qū)間:
0...10
包含頭尾
- 注意
...
之間不能有空格
for i in 0..<10 // 倒過來就是從后往前遍歷
{
print(i)
}
- while:Swift中很少用while循環(huán)
var index = 0
while index < 10
{
print(index)
index ++
}
數組
- let代表不可變數組怠李,var代表可變數組
- 前面不需要加@,會自動把基本數據類型轉換成對象蛤克,不需要包裝`var array = [10捺癞,"哈哈",9.9];
- 定義:var array:[String]? // 定義一個內容為string類型的數組咖耘,并且沒有初始化加個問號
- 獲取:print(array[1])
- 修改:array[1] = @"呵呵"
- 追加:array.append(33) 數組每次加內容翘簇,容量不夠的話,每次會翻倍
- 刪除:array.removeAtIndex(0)// 這個刪除方法會這個刪除的元素返回給我們
- 刪除所有array.removeAll()
- 刪除所有但保存原有容量array.removeAll(keepCapacity:true).靈活使用可以節(jié)省性能
- 合并:注意要相同類型才能合并
var array1 = [1,2,3]
var array2 = [4,5,6]
var array2 = ["4","5","6"]
array1 += array2 // 這樣就完成了合并
// 讓數組按照item的attribute屬性來排序
array = array!.sort({ (item1, item2) -> Bool in
return item1.attribute > item2.attribute
})
字典
- OC:
@{key : value}
- Swift:
[key : value]
- 同樣儿倒,let和var代表不可變和可變字典
// 定義方法1:定義的同時賦值
let dict1 = ["name" : "lhj","age" : 29]
// 定義方法2:定義指明類型版保,再賦值
let dict2:[String:AnyObject]
dict2 = ["name" : "lhj","age" : 29]
- 上面[String:AnyObject]類型是Swift中用的最多的字典類型呜笑,意思就是key是String類型的,value為任意對象
- 獲瘸估纭:
print(dict["name"])
- 注意:取出來的都是可選類型的值叫胁,因為根據這個key取值可能會取不到,返回的值可能是nil
- 可以在[]后面加個嘆號汞幢,代表取出來的一定有值
print(dict["name"]!)
- 更新:dict["name"] = "zhangsan"
- 添加:dict["weight"] = 100
- 遍歷
for key in dict.keys
{
print(key)
}
// Swift特有方法驼鹅,會將字典中的key賦值給for后面的括號中的第一個變量,將value賦值給第二個變量(括號中的變量稱之為元祖)
for (k,v) in dict
{
print(k)
print(v)
}
- 合并 :字典不能像數組那樣+=來合并森篷,只能遍歷再一個個賦值输钩。同樣注意類型需一致
var dict1:[String:AnyObject] = ["name" : "lhj","age" : 29]
var dict2:[String:AnyObject] = ["score" : 99]
for (k,v) in dict1
{
dict2[k] = v
}