Swift學(xué)習(xí)筆記

簡(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 中的 initWithXXXSwift 中通成椋可以使用 類名(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 類型
    • 如果要顯式的指定變量的類型仔役,可以在定義是使用 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ò)

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妇萄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咬荷,更是在濱河造成了極大的恐慌冠句,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幸乒,死亡現(xiàn)場(chǎng)離奇詭異懦底,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)罕扎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門聚唐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丐重,“玉大人,你說(shuō)我怎么就攤上這事杆查“绲耄” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵亲桦,是天一觀的道長(zhǎng)崖蜜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)客峭,這世上最難降的妖魔是什么豫领? 我笑而不...
    開(kāi)封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮舔琅,結(jié)果婚禮上等恐,老公的妹妹穿的比我還像新娘。我一直安慰自己备蚓,他們只是感情好课蔬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著星著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粗悯。 梳的紋絲不亂的頭發(fā)上虚循,一...
    開(kāi)封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音样傍,去河邊找鬼横缔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛衫哥,可吹牛的內(nèi)容都是我干的茎刚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撤逢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼膛锭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蚊荣,我...
    開(kāi)封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤初狰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后互例,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奢入,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年媳叨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腥光。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片关顷。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖武福,靈堂內(nèi)的尸體忽然破棺而出议双,到底是詐尸還是另有隱情,我是刑警寧澤艘儒,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布聋伦,位于F島的核電站,受9級(jí)特大地震影響界睁,放射性物質(zhì)發(fā)生泄漏觉增。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一翻斟、第九天 我趴在偏房一處隱蔽的房頂上張望贩猎。 院中可真熱鬧,春花似錦佑惠、人聲如沸宙址。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砾嫉。三九已至,卻和暖如春窒篱,著一層夾襖步出監(jiān)牢的瞬間焕刮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工墙杯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留配并,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓高镐,卻偏偏與公主長(zhǎng)得像溉旋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫉髓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容