一惧辈、基礎(chǔ)的幾個(gè)知識(shí)點(diǎn)衡怀,很簡(jiǎn)單介牙,但是必須知道和掌握
1.常量和變量
var:變量修飾詞
let:常量修飾詞
2.字符串獲取長(zhǎng)度(兩種方法)
let str1 = "hello"
str.characters.count
let str2 = "hello"
str2.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
3.大小寫(xiě)轉(zhuǎn)換
轉(zhuǎn)大寫(xiě):str.uppercaseString
轉(zhuǎn)小寫(xiě):str.lowercaseString
4.判斷相等
直接用“==”來(lái)判斷
5.拼接
let str2 = String(format: "%02d:%02d", 1,2)
let str3 = String(format: "%02d-%02d", arguments: [1,2])
print(str2)
print(str3)
6.剪切字符串
str2.substringFromIndex(index: Index)
7.字符串其他操作轉(zhuǎn)化為NSString在去操作
let str4:NSString = str2 as NSString
8.數(shù)組相關(guān)知識(shí)
? ?8.1swift的數(shù)組可以和oc的數(shù)組轉(zhuǎn)換房待,在OC中init/ initWith在swift就是轉(zhuǎn)化為()來(lái)表示初始化
let array1 = ["a","b","c"]
let array2 = [String]()
8.2 數(shù)組個(gè)數(shù)
數(shù)組個(gè)數(shù).count
8.3 遍歷數(shù)組
?遍歷數(shù)組forin要明確的指出數(shù)組的類(lèi)型
for temp in array1 as [String] {
print(temp)
print(temp.characters.count)
}
?8.4 元組遍歷
//元組遍歷(能得到下標(biāo))
for(index, value) in array1.enumerate() {
print("index = \(index),value = \(value)")
}
8.5可變數(shù)組
初始化一個(gè)String類(lèi)型的數(shù)組: var mutableArray = [String]()
向數(shù)組添加元素:
mutableArray.append("hello")
mutableArray.append("world")
mutableArray.append("23")
print(mutableArray)
打印之后的結(jié)果:["hello","world","23"]
mutableArray.removeAll(keepCapacity: Bool)一出全部柬脸,是否保存原有的空間
mutableArray.removeFirst(n: Int)從哪個(gè)為第一個(gè)開(kāi)始刪除
9.字典
9.1 創(chuàng)建一個(gè)字典:
let dict = ["key1":"value1","key2":"value2","key3":"value3"]
print(dict)
print(dict["key1"])
9.2 遍歷字典forin
for(tempkey,tempvalue) in dict {
print("key = \(tempkey),value = \(tempvalue)")
//在swift中站位用\( )表示倔矾,括號(hào)內(nèi)填要輸出的參數(shù)
}
9.3 可變字典
var dict3 = ["key":"value"]
9.4 字典的合并
for(tempkey,tempvalue) in dict {
//如果存在則是一個(gè)更新鍵值對(duì)的操作妄均,否則就是一個(gè)增加鍵值對(duì)的操作
dict3[tempkey] = tempvalue
}
10.可選類(lèi)型
10.1?
? ? 如果一個(gè)值可能為nil柱锹,那么這個(gè)值就是可選類(lèi)型,用丰包?表示禁熏。同樣在打印后在輸出欄顯示時(shí)被optional包圍的就是可選類(lèi)型
10.2?
? ? 可選類(lèi)型不能直接使用,必須強(qiáng)制解包邑彪,!就是強(qiáng)制解包瞧毙。對(duì)nil強(qiáng)制解包會(huì)crash。當(dāng)在打印的輸出欄顯示 “unexpectedly found nil while unwrapping an Optional value”時(shí)寄症,就是對(duì)空的可選類(lèi)型強(qiáng)制解包出現(xiàn)的錯(cuò)誤
10.3 一個(gè)簡(jiǎn)單示例
var a1:String?
a1 = "12345"
print(a1!)
print(a1!.characters.count)
10.4 對(duì)可選類(lèi)型進(jìn)行判斷宙彪,若為空則給他一個(gè)默認(rèn)值
print(a1 ?? "234")
11 if語(yǔ)句
if語(yǔ)句和OC中不同的是()的條件語(yǔ)句可以省略。if沒(méi)有非零即真的概念有巧,只有true和false的概念
let temvalue = 10
if temvalue > 5 {
print("tempvalue >5")
}
14. 可選類(lèi)型的條件分支
letstr:String? ="hello"
(1) if-let對(duì)可選類(lèi)型的判斷释漆,若可選類(lèi)型為空,不執(zhí)行代碼塊篮迎,若果不為空灵汪,則用tempstr來(lái)接受此刻這個(gè)可選類(lèi)型解包后的值
if let tempStr = str {
print(tempStr)
}
(2)if-let-where跟if-let相似,where是對(duì)前面定義的這個(gè)局部變量在做一層判斷
if let tempStr = str where tempStr.characters.count>2{
print("tempStr.length =\(tempStr.characters.count)")
}
(3)guard-let-else(守護(hù))如果可選類(lèi)型為nil柑潦,則執(zhí)行code代碼塊享言,最后一定要return,如果不為nil則強(qiáng)制解包后的值賦給tempStr這樣在外面可以使用tempStr
guard let tempStr = str else {
return
}
tempStr
15 ?switch
在swift的switch中不局限整形渗鬼,可為浮點(diǎn)型览露,字符串型,
switch后面的小括號(hào)可以省略譬胎,大括號(hào)不能省略
case后面至少有一條執(zhí)行語(yǔ)句差牛,并且case后面的大括號(hào)可以省略,
break可以不寫(xiě)堰乔,不會(huì)造成貫穿偏化,default一定要寫(xiě),并且只能在最后寫(xiě)
let f =3.2
switch f {
case3.0:
print("===3.0")
case3.1:
print("===3.1")
case3.2:
print("3.2")
default:
print("unknown")
}
16 循環(huán)
下面的方法已經(jīng)被廢棄
for (var i = 0;i < 5;i++) {
}
正確的是
for var i = 0; i < 5; i++ {
print(i)
}
在左閉右開(kāi)區(qū)間[0,5)循環(huán)
for var i in 0..<5 {
print(i)
}
在閉區(qū)間[0,5]循環(huán)
for var i in 0...5 {
print(i)
}
17 枚舉(枚舉可以關(guān)聯(lián)任何類(lèi)型浮點(diǎn)镐侯,字符串侦讨,整型)
關(guān)聯(lián)若是int,會(huì)默認(rèn)遞增上去苟翻,若不是int必須每個(gè)枚舉值都關(guān)聯(lián)上值韵卤。
enumMonth:Float{
caseJanuary =1.1
caseFebruary =1.2
caseMarch =1.3
caseAppril =1.4
caseMay =1.5
caseJune =1.6
}
varmonth1:Month=Month.January
letmonth2 =Month.February
letmonth3:Month= .March
//如果已經(jīng)明確的指出一個(gè)變量是屬于那種類(lèi)型的枚舉的話(huà),可以直接給枚舉賦值
month1= .Appril
switchmonth1{
case.January:
print("hashvalue=\(month1.hashValue),rawValue =\(month1.rawValue)")
case.Appril:
print("hashvalue=\(month1.hashValue),rawValue =\(month1.rawValue)")
case.March:
print("hashvalue=\(month1.hashValue),rawValue =\(month1.rawValue)")
default:
print("unknown")
}
18 閉包
{
(參數(shù)名:參數(shù)類(lèi)型(多個(gè)參數(shù)逗號(hào)隔開(kāi)))->返回值類(lèi)型
in
code(自己寫(xiě)代碼)
}
19 函數(shù)
函數(shù)的寫(xiě)法:
func方法名(參數(shù)列表)->返回值類(lèi)型{
code
}
19.1 無(wú)參無(wú)返
let closure = {
()->()//()或者()->Void
in
print("無(wú)參無(wú)返")
19.2 有參有返
func add(a:Int)->Int {
return a+10
}
print(add(100))
19.3無(wú)參有返
func abb()->String {
return "無(wú)參有返"
}
print(abb())
19.4有參無(wú)返
func acc(a:Int)->Void {
print("有參無(wú)返")
}
print(acc(1))
20 輸入倆個(gè)字符串崇猫,輸入一個(gè)閉包(將輸入的兩個(gè)字符串拼接為一個(gè)字符串)
編寫(xiě)函數(shù):
func combineString(str1:String,str2:String,closure:(tempstr1:String,tempstr2:String)->String) {
//執(zhí)行閉包
letstring = closure(tempstr1: str1, tempstr2: str2)
print(string)
}
調(diào)用:
combineString("love", str2:"you") { (tempstr1, tempstr2) ->Stringin
return"\(tempstr1)\(tempstr2)"
}
21.OC中有的懶加載在swift中也有
寫(xiě)法:
lazy var變量名:變量類(lèi)型= {
code
return
}()
代碼:寫(xiě)懶加載一個(gè)不同
lazy var btn:UIButton= {
var tempBtn =UIButton(type:.ContactAdd)
tempBtn.frame=CGRectMake(90,200,50,50)
tempBtn.backgroundColor=UIColor.greenColor()
returntempBtn
}()
22.異常捕獲(很經(jīng)典)
在OC中我們解析文件或者網(wǎng)絡(luò)解析時(shí)當(dāng)解析的文件中有錯(cuò)時(shí)沈条,會(huì)crash,但是在swift中有了異常捕獲這個(gè)方法诅炉,會(huì)很容易的知道文件解析出錯(cuò)蜡歹,不用再看代碼半天找bug屋厘。
do{
let path =NSBundle.mainBundle().pathForResource("iOS", ofType:"json")
let data:NSData=NSData(contentsOfFile: path!)!
let rootArray = try NSJSONSerialization.JSONObjectWithData(data, options:.MutableContainers) as! ?[[String:String]]
print(rootArray)
} catch {
//異常捕獲。序列化出錯(cuò)就會(huì)自動(dòng)來(lái)到這里
print("error")
}
23 字典轉(zhuǎn)模型
在KVC模式中月而。我們 會(huì)用到字典轉(zhuǎn)模型給model賦值擅这。一般的OC中寫(xiě)的方法是setValuesForKeyWithDictionary:的方法但是在swift中不是!下面就看看該怎么寫(xiě)景鼠。
在model文件中編寫(xiě):
var name:String?
var gender:String?
var age:Int=0//注意:字典轉(zhuǎn)模型中,模型中如果有基本的數(shù)據(jù)類(lèi)型的話(huà)痹扇,基本的數(shù)據(jù)類(lèi)型不可以給我可選類(lèi)型铛漓,否則在KVC賦值就會(huì)出現(xiàn)錯(cuò)誤找不到對(duì)應(yīng)的Key值。若為可選類(lèi)型該給初始值
//字典轉(zhuǎn)模型
init(dict:[String:AnyObject]) {
super.init()
setValuesForKeysWithDictionary(dict)
}
如果自定義了初始化方法并且沒(méi)有實(shí)現(xiàn)系統(tǒng)默認(rèn)的初始化方法鲫构,那么外界訪(fǎng)問(wèn)不到該類(lèi)的默認(rèn)初始化方法浓恶,想要訪(fǎng)問(wèn)到就要手動(dòng)實(shí)現(xiàn)
剛寫(xiě)到KVC模式,就想到面試題里有的會(huì)問(wèn)的“KVC和KVO的區(qū)別”结笨,很搞笑包晰,這兩個(gè)壓根沒(méi)啥關(guān)系!(要非扯有關(guān)系炕吸,就得說(shuō):KVO建立在 KVC 之上)
KVC:Key Value Coding (鍵值編碼)通過(guò)字符串簡(jiǎn)介訪(fǎng)問(wèn)對(duì)象的屬性的方式?
KVO: Key Value Observing(觀(guān)察著模式) 通過(guò)字符串來(lái)監(jiān)聽(tīng)對(duì)象屬性的變化