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

概述階段

iOS崩潰的常見(jiàn)原因
1.系統(tǒng)庫(kù)向上兼容問(wèn)題,某些方法明確被廢棄,在新版本系統(tǒng)中無(wú)法運(yùn)行
2.系統(tǒng)庫(kù)向下兼容問(wèn)題,某些庫(kù)只能在高版本系統(tǒng)中使用,老系統(tǒng)并不支持
3.本地?cái)?shù)據(jù)儲(chǔ)存結(jié)構(gòu)變化,但未兼容過(guò)去的數(shù)據(jù)(用戶已安裝老版本APP),初始化時(shí)無(wú)法正確讀取數(shù)據(jù)
4.訪問(wèn)的數(shù)據(jù)類型不是期望的數(shù)據(jù)類型而產(chǎn)生崩潰,常見(jiàn)的問(wèn)題:NULL、Number類型。解決方案:最優(yōu)勢(shì)服務(wù)器端加入默認(rèn)值,其次可以在客戶端接收數(shù)據(jù)后立即進(jìn)行整體處理,全轉(zhuǎn)為String
5.數(shù)組越界
6.野指針
7.內(nèi)存處理不當(dāng),內(nèi)存泄露。常見(jiàn)于:照片模塊、地圖模塊、block回調(diào)

  1. NSTimer未銷毀,timer只要加入了runloop,那么它就會(huì)對(duì)于self進(jìn)行持有,直到[timer invalidate],所以如果使用timer,一定要記得釋放

Swift知識(shí)點(diǎn):
1.swift中的Array和[]是一個(gè)東西,編譯器會(huì)自動(dòng)識(shí)別
2.Swift中可以使用OC對(duì)象,OC對(duì)象所能使用的方法依然是OC中的方法
3.OC對(duì)象是否可變是根據(jù)自身類型來(lái)的,比如:let聲明的NSMutableArray對(duì)象,依然可以增刪改
4.OC中的可變對(duì)象往往不能直接轉(zhuǎn)成Swift對(duì)象,比如:NSMutableArray無(wú)法直接轉(zhuǎn)為Array
5.Dictionary字典類型依然是由index這個(gè)相關(guān)屬性的,但是字典本身是無(wú)序的,所以這個(gè)index的用法并不是很明朗

代碼階段

Array、NSArray、 NSMutableArray的創(chuàng)建和轉(zhuǎn)換

/**** 方式1、2、3、4均是Swift數(shù)據(jù)類型  方式5、6是OC數(shù)據(jù)類型 ****/
//數(shù)組建立方式1:默認(rèn)建立
let list1 = ["你好","2","3","4"]
//數(shù)組建立方式2:指定類型String
var list2:[String] = ["你好","2","3","4"]
//數(shù)組建立方式3:指定類型Any
let list3:[Any] = ["你好","2","3",3,UILabel()]
//數(shù)組建立方式4:指明Array類型
let list4:Array<Any> =  ["你好","2","3","4",UILabel()]
//數(shù)組建立方式5:指明NSArray類型
let list5:NSArray =  ["你好","2","3","4",UILabel()]
//數(shù)組建立方式6:指明NSMutableArray類型
let list6:NSMutableArray =  ["1","2","3","4"]

/**** 想把 NSArray 轉(zhuǎn)為 Array ****/
//NSArray轉(zhuǎn)換寫法1:依靠自動(dòng)推到,這樣寫系統(tǒng)推斷出的類型為Array<AnyObject>
let list7:Array = list5 as Array
print(list7)
//NSArray轉(zhuǎn)換寫法2:指定數(shù)組內(nèi)容的類型,轉(zhuǎn)換后即為Array<Any>
let list8 = list5 as! Array<Any>
print(list8)
//NSMutableArray轉(zhuǎn)換寫法1:這樣寫雖然可以,但編譯器會(huì)報(bào)警告
let list9 = list6 as! [Any]
print(list9)
//NSMutableArray轉(zhuǎn)換寫法2:遍歷存儲(chǔ)
var list10:Array<String> = Array()
for item in list6 {
    list10.append(item as! String)
}
print(list10)

//Array中添加刪除修改,只有其用var修飾符才可以操作
var list11 = list8
//Swift對(duì)象只能用append
list11.append("11")
list11.removeAll()

//而OC對(duì)象不受修飾符影響,NAArray不可增刪改,NSMutableArray依然用OC中的方法增刪改
let list12 = list6
//OC對(duì)象只能用add
list12.add("12")
list12.removeAllObjects()

Array的增刪改以及遍歷

var list1 = ["1", "2", "3", "4", "5"]
//在某一位置添加,原位置元素向后移
list1.insert("0", at: 0)
//在末尾添加
list1.append("6")
//["0", "1", "2", "3", "4", "5", "6"]
print(list1)
//修改某個(gè)位置的元素
list1[0] = "zero"
//修改某一段,替換進(jìn)去的Array長(zhǎng)度并無(wú)要求,
list1[0..<3] = ["zero", "one"]
//["zero", "one", "3", "4", "5", "6"]
print(list1)
//刪除某一位置元素
list1.remove(at: 0)
//
print(list1)

//常規(guī)遍歷
for item in list1[0..<3] {
    print(item)
}
//元組遍歷
for (index, value) in list1.enumerated() {
    print("Item \(index): \(value)")
}

Array的map()函數(shù)和flatMap()函數(shù)

//Swift中,數(shù)組的每一個(gè)元素都需要執(zhí)行一項(xiàng)操作,除了用for循環(huán),還可以用map函數(shù)
//map()是 Array 提供的方法,通過(guò)接收一個(gè)函數(shù)作為傳入?yún)?shù),對(duì)數(shù)組中每個(gè)元素進(jìn)行函數(shù)變換得到新的結(jié)果值。
//這樣只需要提供X->Y的映射關(guān)系,就能將數(shù)組[X]變換到新數(shù)組[Y],而無(wú)需創(chuàng)建一個(gè)臨時(shí)可變數(shù)組
let lsits = ["張三", "張三的爸爸", "李四", "李四的爸爸"]
let closure = {(str:String) -> String in
    var result = str
    if str.contains("張三") {
        result = "尊敬的" + str
    }
    return result
}
//["尊敬的張三", "尊敬的張三的爸爸", "李四", "李四的爸爸"]
print(lsits.map(closure))
//如果內(nèi)部操作足夠簡(jiǎn)單,還有這種寫法
print(lsits.map {$0 + ",你好" })

//map函數(shù)中可以嵌套map函數(shù)
let numbers2 = [[1,2,3],[4,5,6]];
let result2 = numbers2.map{ $0.map{ $0 + 2 } }
// [[3, 4, 5], [6, 7, 8]]
print(result2)

//除了map還有flatMap()方法,
//如果map()是X->Y,那么flatMap()就是X->Y?,且flatMap()會(huì)剔除nil的數(shù)據(jù)
//簡(jiǎn)單的說(shuō):flatMap()除了給每個(gè)數(shù)據(jù)綁定一個(gè)固定的操作外,還可以剔除不符合要求的數(shù)據(jù)
let numbers3 = [1,2,3,4];
let result3 = numbers3.flatMap { (v) -> String? in
    if v <= 2 {
        return nil
    }
    return String(v)
}
//["3", "4"],注意這里還會(huì)的是一個(gè)[String]數(shù)組了
print(result3)

Array的Sort()函數(shù)

let numbers = [12,25,1,35,27]
//常規(guī)寫法
let numbersSorted = numbers.sorted{ (n1, n2) -> Bool in
    //index越大,值越小,倒序
    return n2 < n1
}
print(numbersSorted)
//極簡(jiǎn)寫法(index越大,值越大,正序)
let numbersSorted2 = numbers.sorted {$1 > $0}
print(numbersSorted2)
//終極蛇皮寫法(正序)
numbers.sorted(by: <)

Dictionary的創(chuàng)建和刪除

//Swift中只要滿足Hashable協(xié)議,都可以做字典的key
var intDict = [Int: String]()
//float或double類型也可以
var doubleDict = [1.1:"1",2.1:"2"]
//甚至Data、Date類型均是可以的
var dateDict = [Date(): "當(dāng)前時(shí)間"]

//此時(shí),不指定類型,默認(rèn)dict的推斷類型為[String:String?]
var testDict:[String:String?] = ["key1": "value1", "key2": nil]
//在初始化時(shí),value中可以存在nil值,但是后續(xù)添加元素的時(shí)候不允許再添加nil值
testDict["key3"] = nil
//["key2": nil, "key1": Optional("value1")]
print(testDict)
//updateValue()更新值方法,同時(shí)它會(huì)有一個(gè)返回值,返回該key舊的值
//如果該key在原字典中不存在,那么返回值就會(huì)為nil
if let oldValue = testDict.updateValue("value4", forKey: "key4") {
    print("The old value for DUB was \(oldValue).")
}
print(testDict)
//只要這個(gè)key在原字典中存在,返回值就有效
if let oldValue = testDict.updateValue("value2", forKey: "key2") {
    //會(huì)被打印
    print("The old value for is \(oldValue).")
}
//["key2": Optional("value2"), "key4": Optional("value4"), "key1": Optional("value1")]
print(testDict)
//刪除方式1
testDict.removeAll()
//true
print(testDict.isEmpty)
//刪除方式2
testDict = [:]
//true
print(testDict.isEmpty)

Dictionary的遍歷

var dict = [1:"23",3:"3",5:"23",7:"3"]
//元組遍歷方式
for (key, value) in dict {
    print("\(key): \(value)")
}
for key in dict.keys {
    print("打印key值: \(key)")
}
for value in dict.values {
    print("打印Value值: \(value)")
}
//dict.keys不是常見(jiàn)的Array數(shù)組,需要進(jìn)行轉(zhuǎn)換才可成為正常的Array
//更準(zhǔn)確的說(shuō)dict.keys是LazyMapCollection類型,這是種可以強(qiáng)轉(zhuǎn)為Array的類型
let keys = [Int](dict.keys);
print(keys);

Dictionary的index

/*
 雖然dict是無(wú)序的,但實(shí)際上dict依然可以使用dict.index()和dict.enumerated()
 甚至還可以根據(jù)index去remove,這一點(diǎn)很奇怪
 這里的index依然可以作為索引找到對(duì)應(yīng)元素,但實(shí)際上是無(wú)序的
 沒(méi)事不要去用了,會(huì)出問(wèn)題的
 */
//唯一正常的和index相關(guān)的用法
//先找到key對(duì)應(yīng)的index值
let index = dict.index(forKey: 1)
//然后刪除它
dict.remove(at: index!)
//打印
for num in dict.enumerated() {
    print("打印信息:index:",num.offset,"value:",num.element)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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