簡(jiǎn)介
- Swift 語(yǔ)言由蘋果公司在 2014 年推出,用來(lái)撰寫 OS X 和 iOS 應(yīng)用程序
- 2014 年如绸,在 Apple WWDC 發(fā)布
歷史
- 2010 年 7 月,蘋果開(kāi)發(fā)者工具部門總監(jiān)
Chris Lattner(克里斯·拉特納)
開(kāi)始著手 Swift 編程語(yǔ)言的設(shè)計(jì)工作 - 用一年時(shí)間旭贬,完成基本架構(gòu)
-
Swift 大約歷經(jīng) 4 年的開(kāi)發(fā)期竭沫,2014 年 6 月發(fā)表
abc.jpg
常量&變量
// 定義變量
var i = 10
print(i)
i = 15
print(i)
let j = 20
// 常量一經(jīng)定義不能自改數(shù)值
// j = 25
print(j)
- 小結(jié)
-
var
定義變量,設(shè)置之后可以修改 -
let
定義常量骑篙,設(shè)置之后不可以修改 - 語(yǔ)句末尾不用使用
;
- 在 Swift 中使用
print()
替代 OC 中的NSLog
-
print
的性能更好
-
定義 OC 對(duì)象
// 實(shí)例化視圖
let v = UIView(frame: CGRectMake(0, 0, 100, 100))
// 設(shè)置背景顏色
v.backgroundColor = UIColor.redColor()
// 添加到根視圖
view.addSubview(v)
- 小結(jié)
- 在
Swift
中要實(shí)例化一個(gè)對(duì)象可以使用類名()
的格式,與OC
中的alloc/init
等價(jià) -
OC
中的initWithXXX
在Swift
中通成椋可以使用類名(XXX: )
找到對(duì)應(yīng)的函數(shù) -
OC
中的[UIColor redColor]
類方法靶端,在Swift
中通常可以使用類名.XXX
找到對(duì)應(yīng)的函數(shù) - 使用
let
修飾v
并且賦值凛膏,表示該常量的內(nèi)存地址不允許修改杨名,但是可以修改其內(nèi)部的屬性
- 當(dāng)前對(duì)象的屬性,不需要使用
self.
- 在
常量&變量的使用原則:盡量先用 let猖毫,只有需要變的時(shí)候台谍,再用 var,能夠更加安全
變量類型
let x = 10
let y = 10.5
let z: Double = 20
print(Double(x) + y)
print(x + Int(y))
print(y + z)
- 小結(jié)
- 初次接觸
Swift
中會(huì)因?yàn)楹?jiǎn)單的var
let
誤以為Swift
中的類型非常松散 - 其實(shí)所有變量的準(zhǔn)確類型都是在賦值的同時(shí)自動(dòng)推導(dǎo)的
-
Swift
是對(duì)類型要求非常嚴(yán)格的一門語(yǔ)言吁断,一個(gè)值永遠(yuǎn)不會(huì)被自動(dòng)轉(zhuǎn)換成其他類型
- 如果要轉(zhuǎn)換趁蕊,必須顯示轉(zhuǎn)換,Swift 中
- 小數(shù)默認(rèn)是
Double
類型 - 整數(shù)默認(rèn)是
Int
類型
- 小數(shù)默認(rèn)是
- 如果要顯式的指定變量的類型仔役,可以在定義是使用
var 變量名: 類型 = 值
- 初次接觸
邏輯分支
var i = 10
if i > 0 {
print("OK")
}
- 小結(jié)
-
Swift
中沒(méi)有 C 語(yǔ)言中的非零即真
概念 - 在邏輯判斷時(shí)必須顯示地指明具體的判斷條件
-
if
語(yǔ)句條件的()
可以省略 - 但是
{}
不能省略
-
三目
var a = 10
var b = 50
var result = a > b ? a : b
print(result)
- 小結(jié)
-
Swift
中的三目
運(yùn)算保持了和 OC 一致的風(fēng)格
-
可選項(xiàng)
演練 1
let url = NSURL(string: "http://www.baidu.com/")
if url != nil {
NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, _, _) -> Void in
print(NSString(data: data!, encoding: NSUTF8StringEncoding))
}).resume()
}
- 小結(jié)
- 在
Swift
中掷伙,不是所有的對(duì)象實(shí)例化方法都會(huì)返回值,在實(shí)際開(kāi)發(fā)中需要注意實(shí)例化函數(shù)的返回類型又兵,例如:
- 在
convenience init?(string URLString: String)
* 如果有 `?` 表示該方法有可能無(wú)法實(shí)例化到正確的對(duì)象
* 這種函數(shù)返回的對(duì)象任柜,被稱為 `可選項(xiàng)`,即有可能有值沛厨,也有可能沒(méi)有值
* 實(shí)際開(kāi)發(fā)時(shí)宙地,需要針對(duì)這種對(duì)象加以判斷,并且在分支內(nèi)部使用 `!`逆皮,指明改對(duì)象確實(shí)是存在的
* 相比在 `OC` 的開(kāi)發(fā)宅粥,尤其在日常練習(xí)時(shí),會(huì)給定一個(gè)能夠運(yùn)行的值电谣,而在實(shí)際運(yùn)行時(shí)粹胯,一旦條件不滿足蓖柔,會(huì)直接閃退,這樣用戶體驗(yàn)會(huì)非常不好
Swift
的設(shè)計(jì)者考慮到因?yàn)閷?duì)類型的強(qiáng)制要求风纠,會(huì)讓代碼很難看况鸣,因此提供了一個(gè)變通的解決方案
演練 2
if let url = NSURL(string: "http://www.baidu.com") {
NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, _, _) -> Void in
print(NSString(data: data!, encoding: NSUTF8StringEncoding))
}).resume()
}
-
小結(jié)
- 使用
if let 常量 = 可選構(gòu)造函數(shù)
的方式能夠確保分支內(nèi)部常量一定是有值的 - 并且在分支內(nèi)部不再需要使用
!
- 這是
Swift
代碼中的一個(gè)非常重要的使用技巧
- 使用
-
提示
- 盡管
Swift
提供了類型校驗(yàn)的手段,但是要寫出優(yōu)雅
的 Swift 代碼竹观,還是需要多加練習(xí)的镐捧,否則一不小心就會(huì)出現(xiàn)分支嵌套層次很深的代碼 - 有關(guān)
?
和!
的選擇,可以借助 Xcode 的輔助工具臭增,但是強(qiáng)烈建議每次遇到提示時(shí)懂酱,要多加思考,反復(fù)揣摩
- 盡管
演練3
var name: String?
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
name = "zhangsan"
print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
let l = 10
print(l + (name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) ?? 0))
- 階段性小結(jié)
-
??
是一個(gè)非常有用的操作符誊抛,能夠快速對(duì)nil
進(jìn)行判斷 - 如果對(duì)象是
nil
列牺,則使用??
后面的值代替前面的nil
值參與計(jì)算 - 在使用
??
時(shí),整個(gè)部分需要使用()
包裝 - 這一技巧在
UITableView
的數(shù)據(jù)源方法中尤為重要
-
循環(huán)
OC風(fēng)格的 for
// 傳統(tǒng)寫法
for var i = 0; i < 10; i++ {
print(i)
}
Swift風(fēng)格的 for
// 遍歷 0 ~ <10
for i in 0..<10 {
print(i)
}
print("---")
// 遍歷 0 ~ 10
for i in 0...10 {
print(i)
}
- 小結(jié)
-
Swift
中使用in
關(guān)鍵字標(biāo)示循環(huán)的范圍 -
0..<10
表示從0到9 -
0...10
表示從0到10 - 注意之間不能出現(xiàn)空格
-
特殊寫法
for _ in 0...10 {
print("hello")
}
- 小結(jié)
- 如果不關(guān)心循環(huán)本身的索引拗窃,可以使用
_
忽略 - 這一技巧在之前的分支演練中出現(xiàn)過(guò)
- 如果不關(guān)心循環(huán)本身的索引拗窃,可以使用
while
while和OC差不多,swift中很少使用
var a = 0
while a < 10
{
print(a)
a += 1;
}
do while
循環(huán)發(fā)生很大的變化瞎领,do while 沒(méi)有do了,因?yàn)閐o被用作捕獲異常
取而代之的是repeat
var b = 0;
repeat {
print(b);
b+=1;
}while b < 10
數(shù)組
簡(jiǎn)單體驗(yàn)
let arr = ["zhangsan", "lisi"]
print(arr)
// 遍歷每一個(gè)元素
for a in arr {
print(a)
}
// 像 OC 一樣打印
print(arr as NSArray)
數(shù)組中保存的對(duì)象類型
// 數(shù)組中保存的都是字符串
let arr = ["zhangsan", "lisi"]
// 數(shù)組中保存的是 NSObject
let arr1 = ["zhangsan", 1]
- 小結(jié)
- 數(shù)組使用 [] 定義随夸,這一點(diǎn)與 OC 相同
- 如果初始化時(shí)九默,所有內(nèi)容類型一致,擇數(shù)組中保存的是該類型的內(nèi)容
- 如果初始化時(shí)宾毒,所有內(nèi)容類型不一致驼修,擇數(shù)組中保存的是
NSObject
常見(jiàn)數(shù)組操作
// 定義只能保存字符串類型數(shù)組
var array: [String]
// 初始化數(shù)組
array = ["zhangsan"]
// 添加元素
array.append("lisi")
print(array)
// 刪除元素
array.removeAtIndex(1)
print(array)
// 刪除所有元素
array.removeAll(keepCapacity: true)
print(array.capacity)
// 注意數(shù)組容量的變化
for i in 0..<10 {
array.append("\(i)")
print("\(array) --- \(array.capacity)")
}
// 實(shí)例化新的數(shù)組
var array2 = [String]()
array2.append("1")
array2.append("2")
// 拼接數(shù)組
array += array2
print(array)
- 小結(jié)
- 如果定義數(shù)組時(shí)指定了保存對(duì)象的類型,擇不能向數(shù)組中添加其他類型的內(nèi)容
- 可以使用
[String]()
-
let
定義的數(shù)組是不可變的
-
var
定義的數(shù)組是可變的
字典
//創(chuàng)建字典 let dict: [String : NSObject]類型是以后iOS開(kāi)始種最為常見(jiàn)的一種格式
var dict = ["name":"mJ","age":30];
//獲取value
dict["name"]
dict["123"]
//遍歷1
for key in dict.keys
{
print(dict[key]);
}
//遍歷2
//利用原則類型遍歷字典诈铛,會(huì)自動(dòng)將字典中的key賦值給元組中的第一變量 將value賦值元組中的第二個(gè)變量
for(key ,value) in dict
{
print(key);
print(value);
}
//增加key/value
//如果對(duì)應(yīng)的key在字典中沒(méi)有乙各,就會(huì)新增
dict["sex"] = "man"
print(dict);
//更新
//如果對(duì)應(yīng)的key在字典中有,就會(huì)更新
dict["sex"] = "women";
dict
//刪除
dict .removeValueForKey("sex");
dict
//合并 += 是不可以的 //利用如果字典中沒(méi)有key就新增的特性
var dict2 = ["score":99];
for(key,value) in dict2
{
dict[key] = value
}
字符串
- OC中的字符串 NSString 類型
- Swift中是String類型
- OC 中字符串是一個(gè)對(duì)象 繼承NSObject
- Swift中的字符串是一個(gè)結(jié)構(gòu)體
- Swift中的字符串性能比OC中高
var str1: String = "hello world"
var str2: String = "123"
//拼接
str1 + str2
//格式化 swift使用\()來(lái)拼接
let age = 1;
let name = "name"
var str3 = "name = \(name)---age = \(age)"
str3
//另一種拼接方式(對(duì)應(yīng)stringWithFormat)
var str4 = String(format: "%02d:%02d:%02d", arguments:[0,6,7])
//注意所有的值必須放到數(shù)組中,哪怕只有一個(gè)值也要放到數(shù)組中
//截取
//Swift中幢竹,如果需要截取字符串觅丰,建議使用OC 字符串截取,Swift中字符串和OC字符串可以非常方便的進(jìn)轉(zhuǎn)換
//創(chuàng)建一個(gè)NSString類型的字符串
var str5:NSString = "zhangsan";
//創(chuàng)建一個(gè)swift的字符串并且把它當(dāng)做NSString
var str6 = "zhangsan" as NSString
var subStr = str6.substringWithRange(NSMakeRange(1, 3))
//Swift中字符串支持直接遍歷
for a in str4.characters
{
print(a);
}
函數(shù)
語(yǔ)義->將前面計(jì)算的結(jié)果返回給->返回值
定義格式 function 函數(shù)名稱(參數(shù)列表)-> 返回值
{
執(zhí)行代碼
}
//沒(méi)有返回值沒(méi)有參數(shù) 沒(méi)有返回值使用Void
//簡(jiǎn)寫
//1.func say ->()
//2.func say
func say()-> Void{
print("hello");
}
say()
//有返回值沒(méi)有參數(shù)
func speak() -> Bool
{
return false;
}
speak()
//有參數(shù)沒(méi)有返回值 在swift中會(huì)自動(dòng)將形參列表中的第二個(gè)參數(shù)開(kāi)始的參數(shù)名稱作為標(biāo)簽妨退,以便提高閱讀性
func sun (a :Int, b :Int)
{
let sun = a+b;
print(sun)
}
sun(10, b: 20)
//添加標(biāo)簽Swift2.0之前, x/y稱之為外部參數(shù).a/b稱之為內(nèi)部參數(shù)
func sum2 (x a:Int, y b:Int)
{
print(a + b);
}
sum2(x: 1, y: 2)
//有參數(shù)有返回值
func sum3 (a : Int , b :Int) -> Int
{
return (a + b);
}
sum3(1, b: 10)