Swift基礎(chǔ)知識整理1

雖然Swift這門語言還很年輕,但是不可否認(rèn)的是Swift很強大,也很便捷,但是習(xí)慣于OC編程之后再去寫swift難免會覺得別扭,今天有時間,我就來把Swift的一些知識點加以整理,也便于自己以后查閱和重新溫習(xí),爭取每天一篇,第一天就從最基礎(chǔ)的開始整理

首先是新建一個swift工程,這個和OC是一樣的,只不過在建的過程中把OC語言改成swift,這里就不再贅述

1.swift的基本操作

1.字符串操作

在swift中 let表示常量 var 表示變量

let str = "hello"

//長度str.characters.count

//長度 str.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)

//大小寫轉(zhuǎn)換

//str.uppercaseString

//str.lowercaseString

//相等 ==? 拼接 +

//插入 "123\(str)4567"

//格式化創(chuàng)建字符串 加占位符的

let str3 = String(format: "%02d:%02d", arguments: [1,2])

let str2 = String(format: "%02d:%02d", 1,2)

print(str2)

print(str3)

//字符串的其他操作全部轉(zhuǎn)換為NSString再去操作
//轉(zhuǎn)換 的方法
let str4:NSString = str2 as NSString

2.數(shù)組的操作

Swift的數(shù)組和OC的數(shù)組可以互相轉(zhuǎn)化

//不可變數(shù)組

let array1 = ["A","3","C"]

//可變數(shù)組

var mutableArray = [String]()

//往數(shù)組中添加元素

mutableArray.append("world")

在這里要說一下的是這個 let array= [String]()

這個式子表示的是 初始化一個存放字符串類型的空白數(shù)組

()代表初始化 OC里的initWith/init 在swift里面全部轉(zhuǎn)化成()

在對數(shù)組操作有個要注意的點

1.for -in遍歷數(shù)組的時候一定要明確的指出數(shù)組的類型

for temp in array1 as [String]{

print(temp.characters.count)

}

2.元組遍歷數(shù)組中的值

for (index, value) in array1.enumerate()

{

print("index = \(index),value = \(value)")

}

3.字典的操作

在OC中字典要用 {} 表示 但是在swift中我們依然用[ ] 表示字典,這是一個不想同的點

1.不可變字典

let dict = ["key1":"value1","key2":"value2","key3":"value3"]

//通過key值訪問value值

print(dict["key1"])

1.1 for-in 元組遍歷字典的時候和數(shù)組有不同的地方,不用在后面加枚舉,直接遍歷即可

//for -in 遍歷 (不用在后面加枚舉)

for (key,value) in dict

{

//print("key = \(key), value = \(value)")

}

2.可變字典

var dict2 = ["key":"value"]

2.1如果可變字典合并另一個字典

這里要注意的時 如果key存在于原字典則是一個更新鍵值對的操作,否則是增加鍵值對操作

//合并

for (key,value) in dict

{

dict2[key] = value

}


4. 可選類型 封包 解包


//如果一個值可能為nil,那么這個值就是可選類型,用?標(biāo)識

//Optional包圍的就是可選類型

//可選類型不能直接使用,必須進行強制解包,!強制解包,對nil進行強制解包就會崩潰

如果swift出現(xiàn)了這個錯誤 fatal error: unexpectedly found nil while unwrapping an Optional value

那么原因就是對一個空的可選類型進行強制解包

下面舉個例子

var a1:String?

a1 = "皮卡皮卡"

print(a1!.characters.count)

補充:有人經(jīng)常會看到這樣的語句 (a1 ?? "123") 這個語句是什么意思呢

這個語句的意思就是對可選類型進行判斷,如果為空就給一個值"123",這是對可選類型進行一個保護讓它解包時不至于崩潰

print((a1 ?? "123").characters.count)

5. 判斷

1.if判斷

swift的if判斷和OC有兩點的不同

1.1 if 條件語句()可省略,{}不能省略

1.2 判斷沒有非零即真的概念,只有true false的兩種情況這樣可以使判斷更準(zhǔn)確效率更高更有針對性

let tempValue = 10

if tempValue > 5

{

print("這很Swift")

}

2.三種可選類型的條件分支

2.1 if-let

if-let 是對可選類型的判斷,如果可選類型為空,則不執(zhí)行代碼塊,如果不為空時,用tempStr來接收此刻這個可選類型的解包后的值 只能判斷可選類型

let string:String? = "比比鳥"

if let tempStr = string

{

print(tempStr)

}

2.2 if-let-where

跟 if-let 相似,where是對前面定義的這個局部變量再做一層判斷

如果不為空且位數(shù)大于2

let string:String? = "比比鳥"

if let tempStr1 = string where tempStr1.characters.count > 2

{

print("tempStr1.length = \(tempStr1.characters.count)")

}

?2.3 guard-let-else(守護)

跟 if-let 相反 如果可選類型str為nil,則執(zhí)行代碼塊,最后一定要return,如果不為nil則強制解包后的值賦值給tempStr,這樣在{}外面就可以使用tempStr

let str:String? = nil

guard let tempStr = str else

{

print("str = nil")

return

}

print(tempStr)

3.switch

在這里我們也著重注意下swift中的switch和OC中的switch的區(qū)別

3.1 在swift中

(1).switch不局限判斷整型,可以是浮點型,也可以是字符串等等

(2).switch 后面的小括號可以省略,大括號不能省略

(3).case后面至少要有一條執(zhí)行語句,并且case后面的大括號可以省略,break可以不寫,不會造成貫穿

(4).default一定要寫,且只能寫在最后

寫法為

let f = 3.2

switch f

{

case 3.0:

print("湊數(shù)的判斷語句")

case 3.1:

print("這還是一個湊數(shù)的")

case 3.2:

print("這又是一個湊數(shù)的")

default:

print("這是default的判斷語句")

}

6.循環(huán)

因為OC的while和do while和swift相差并不大所以就不再贅述 我簡單總結(jié)下for循環(huán)

下面的寫法雖然最熟悉但是這個寫法在2.2版本已經(jīng)廢棄了

for (var i = 0;i < 5;i++){

}

現(xiàn)在我的swift的寫法是這樣的 但是好像最新版本的swift好像也會報錯,這個我等會看一下

for var i = 0 ; i < 10 ; i++

{

print(i)

}

2種for in循環(huán)

注意區(qū)分兩者的不同 差別在" ."? 和 "< "

這是0-4的遍歷

for i in 0..<5

{

print("i = \(i)")

}

這是0-5的遍歷

for i in 0...5

{

print("i = \(i)")

}

7.枚舉

老規(guī)矩,先對比OC來看

相對于OC來說swift的枚舉更加強大 swift的枚舉值可以關(guān)聯(lián)浮點型,字符串,并且沒有默認(rèn)的關(guān)聯(lián)值

注意觀察下面兩個代碼的差別

關(guān)聯(lián)如果是int,會默認(rèn)的遞增上去,如果不是int類型的話,必須每個枚舉值都關(guān)聯(lián)上

enum Month:Init

{

case January = 3

case February

case March

case April

}


enum Month:Float

{

case January = 11.2

case February = 12.2

case March = 13.2

case April = 14.2

}

調(diào)用枚舉

如果明確指出一個變量/常量是屬于哪種枚舉類型的話,可以直接.枚舉值賦值,否則就 枚舉類型.枚舉值

let month = Month.April

let month1:Month = .January

switch month

{

//hasValue 代表第幾個枚舉

case .January:

print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")

print(month)

case .February:

print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")

print(month)

case .March:

print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")

print(month)

case .April:

print("hasValue = \(month.hashValue),rawValue = \(month.rawValue) ")

print(month)

}

2.常用swift的操作

1.懶加載

swift的懶加載格式為

lazy var 變量名:變量類型 = {

code 初始化

return

}()

以 初始化一個button為例

lazy var btn:UIButton = {

var tempBtn = UIButton(type:UIButtonType.ContactAdd)

tempBtn.frame = CGRectMake(90,100,50,50)

tempBtn.backgroundColor = UIColor.cyanColor()

return tempBtn

}()

2.閉包


閉包是自包含的功能代碼塊,可以在代碼中使用或者用來作為參數(shù)傳值。

在Swift中的閉包與C、OC中的blocks和其它編程語言(如Python)中的lambdas類似。

閉包格式? 閉包作用回調(diào)傳值

var 閉包變量 ={

(參數(shù)名:參數(shù)類型)-> 返回值類型 in

代碼塊

}


具體實現(xiàn)

//無參無返

let closure = {

()->()//() -> void , ()

in

print("無參無返")

}

closure()

//有參無返

let closure1 = {

(tempStr1 str:String,tempStr2 str2:String) -> ()

in

print("有參無返")

}

closure1(tempStr1: "hello",tempStr2: "world")

//無參有返

let closure2 = {

() -> String

in

print("無參有返")

return "aaaaa"

}

print(closure2())

//有參有返

let closure3 =

{

(str:String) -> Int

in

return 32

}

print(closure3("給我打印個數(shù)吧"))

3.方法 的聲明和實現(xiàn)


格式

func 方法名(參數(shù)列表) ->返回值類型{

}

具體的實現(xiàn)代碼

func text(str:String) ->String

{

return "有參有返"

}

func text1()->String

{

return "無參有返"

}

func text2()

{

print("無參無返")

}

func text3(str:String)

{

print("有參無返")

}

print(text("啦啦啦"))

print(text1())

text2()

text3("哈哈哈哈")

把閉包作為參數(shù)的方法實現(xiàn)示例

假如我們要實現(xiàn)兩個string的拼接

首先聲明一個方法在方法內(nèi)部執(zhí)行閉包

func combineString(str1:String,str2:String,closure:(tempStr1:String,tempStr2:String)->String)

{

//執(zhí)行閉包

let string =? closure(tempStr1: str1, tempStr2: str2)

print(string)

}

調(diào)用的時候?qū)崿F(xiàn)函數(shù)

combineString("hello", str2: "world") { (tempStr1, tempStr2) -> String in

return "\(tempStr1) \(tempStr2)"

}


4.單例的創(chuàng)建

首先創(chuàng)建一個繼承與NSObject的類 因為swift沒有 .h文件所以直接就在文件中創(chuàng)建單例

創(chuàng)建單例有兩種寫法

寫法1

var name:String?

?static var shareSingleDog:singleDog = {

? let instance = singleDog()

?? return instance

寫法2

static let instance = singleDog()

static func shareSingleDog()->singleDog{

return instance

}

寫法1的調(diào)用

let s1 = singleDog.shareSingleDog

s1.name = "皮卡"

let s2 = singleDog.shareSingleDog

print(s2.name)

寫法2的調(diào)用

let s3 = singleDog.shareSingleDog()

s3.name = "水箭龜"

let s4 = singleDog.shareSingleDog()

print(s4.name)

5.KVC異常捕獲

在OC中我們經(jīng)常使用KVC在swift中也有需要注意的點

1.字典轉(zhuǎn)模型

(1)新建模型類 以person為例

var name:String?

var age:Int = 0

var gender:String?

這里需要注意模型中如果有基本數(shù)據(jù)類型的話,基本數(shù)據(jù)類型不可以為可選類型,否則在KVC賦值中會找不到對應(yīng)的key值.如果為可選類型的話必須給個初始值

(2)重寫初始化方法

init(dict:[String:AnyObject]) {

super.init()

setValuesForKeysWithDictionary(dict)

}

重寫完初始化方法后,系統(tǒng)自帶的默認(rèn)初始化方法就不能被調(diào)用,如果還想調(diào)用默認(rèn)的初始化方法則需要寫下以下的方法

override init() {

}

(3)外界字典轉(zhuǎn)模型

let dict = ["name":"zhangsan","age":12,"gender":"男"]

let person = Persone(dict: dict)

//let person = Persone() (系統(tǒng)自帶的初始化方法)

print(person.name)

print(person.age)

print(person.gender)

2.解析

1.獲取路徑

let path = NSBundle.mainBundle().pathForResource("iOS04", ofType: "json")

如果返回值是可選類型的就需要解包

如果實在記不住解包,可以寫完根據(jù)提示來補全

let data:NSData = NSData (contentsOfFile: path!)!

do{

let rootArray = try NSJSONSerialization .JSONObjectWithData(data, options: .MutableContainers) as! [[String:String]]

print(rootArray)

}catch

{

//異常捕獲序列化出錯的時候就會自動來到這里

print("error")

}

最后需要注意的一點就是

swift里面盡量不要寫self一般只有在閉包內(nèi)部才會強制要求寫self

以上就是swift基礎(chǔ)部分的簡單總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容