2020.6.16 學習筆記

概述階段

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

  1. NSTimer未銷毀棺禾,timer只要加入了runloop,那么它就會對于self進行持有,直到[timer invalidate]峭跳,所以如果使用timer膘婶,一定要記得釋放

Swift知識點:
1.swift中的Array和[]是一個東西,編譯器會自動識別
2.Swift中可以使用OC對象蛀醉,OC對象所能使用的方法依然是OC中的方法
3.OC對象是否可變是根據(jù)自身類型來的悬襟,比如:let聲明的NSMutableArray對象,依然可以增刪改
4.OC中的可變對象往往不能直接轉(zhuǎn)成Swift對象拯刁,比如:NSMutableArray無法直接轉(zhuǎn)為Array
5.Dictionary字典類型依然是由index這個相關(guān)屬性的脊岳,但是字典本身是無序的,所以這個index的用法并不是很明朗

代碼階段

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

/**** 方式1割捅、2、3帚桩、4均是Swift數(shù)據(jù)類型  方式5亿驾、6是OC數(shù)據(jù)類型 ****/
//數(shù)組建立方式1:默認建立
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:依靠自動推到,這樣寫系統(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:這樣寫雖然可以莫瞬,但編譯器會報警告
let list9 = list6 as! [Any]
print(list9)
//NSMutableArray轉(zhuǎn)換寫法2:遍歷存儲
var list10:Array<String> = Array()
for item in list6 {
    list10.append(item as! String)
}
print(list10)

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

//而OC對象不受修飾符影響郭蕉,NAArray不可增刪改疼邀,NSMutableArray依然用OC中的方法增刪改
let list12 = list6
//OC對象只能用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)
//修改某個位置的元素
list1[0] = "zero"
//修改某一段,替換進去的Array長度并無要求召锈,
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ù)組的每一個元素都需要執(zhí)行一項操作,除了用for循環(huán)烟勋,還可以用map函數(shù)
//map()是 Array 提供的方法规求,通過接收一個函數(shù)作為傳入?yún)?shù)筐付,對數(shù)組中每個元素進行函數(shù)變換得到新的結(jié)果值卵惦。
//這樣只需要提供X->Y的映射關(guān)系,就能將數(shù)組[X]變換到新數(shù)組[Y]瓦戚,而無需創(chuàng)建一個臨時可變數(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)部操作足夠簡單沮尿,還有這種寫法
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()會剔除nil的數(shù)據(jù)
//簡單的說:flatMap()除了給每個數(shù)據(jù)綁定一個固定的操作外畜疾,還可以剔除不符合要求的數(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"]赴邻,注意這里還會的是一個[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)
//極簡寫法(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(): "當前時間"]

//此時,不指定類型了赌,默認dict的推斷類型為[String:String?]
var testDict:[String:String?] = ["key1": "value1", "key2": nil]
//在初始化時,value中可以存在nil值墨榄,但是后續(xù)添加元素的時候不允許再添加nil值
testDict["key3"] = nil
//["key2": nil, "key1": Optional("value1")]
print(testDict)
//updateValue()更新值方法,同時它會有一個返回值勿她,返回該key舊的值
//如果該key在原字典中不存在袄秩,那么返回值就會為nil
if let oldValue = testDict.updateValue("value4", forKey: "key4") {
    print("The old value for DUB was \(oldValue).")
}
print(testDict)
//只要這個key在原字典中存在,返回值就有效
if let oldValue = testDict.updateValue("value2", forKey: "key2") {
    //會被打印
    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不是常見的Array數(shù)組逢并,需要進行轉(zhuǎn)換才可成為正常的Array
//更準確的說dict.keys是LazyMapCollection類型,這是種可以強轉(zhuǎn)為Array的類型
let keys = [Int](dict.keys);
print(keys);

Dictionary的index

/*
 雖然dict是無序的之剧,但實際上dict依然可以使用dict.index()和dict.enumerated()
 甚至還可以根據(jù)index去remove,這一點很奇怪
 這里的index依然可以作為索引找到對應(yīng)元素,但實際上是無序的
 沒事不要去用了筒狠,會出問題的
 */
//唯一正常的和index相關(guān)的用法
//先找到key對應(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)容合作請聯(lián)系作者
  • 序言:七十年代末猪狈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辩恼,更是在濱河造成了極大的恐慌雇庙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灶伊,死亡現(xiàn)場離奇詭異疆前,居然都是意外死亡,警方通過查閱死者的電腦和手機聘萨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門竹椒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人米辐,你說我怎么就攤上這事胸完。” “怎么了翘贮?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵赊窥,是天一觀的道長。 經(jīng)常有香客問我狸页,道長锨能,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮址遇,結(jié)果婚禮上熄阻,老公的妹妹穿的比我還像新娘。我一直安慰自己倔约,他們只是感情好秃殉,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浸剩,像睡著了一般复濒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乒省,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天巧颈,我揣著相機與錄音,去河邊找鬼袖扛。 笑死砸泛,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蛆封。 我是一名探鬼主播唇礁,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惨篱!你這毒婦竟也來了盏筐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤砸讳,失蹤者是張志新(化名)和其女友劉穎琢融,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體簿寂,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡漾抬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了常遂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纳令。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖克胳,靈堂內(nèi)的尸體忽然破棺而出平绩,到底是詐尸還是另有隱情,我是刑警寧澤漠另,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布捏雌,位于F島的核電站,受9級特大地震影響酗钞,放射性物質(zhì)發(fā)生泄漏腹忽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一砚作、第九天 我趴在偏房一處隱蔽的房頂上張望窘奏。 院中可真熱鬧,春花似錦葫录、人聲如沸着裹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骇扇。三九已至,卻和暖如春面粮,著一層夾襖步出監(jiān)牢的瞬間少孝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工熬苍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稍走,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓柴底,卻偏偏與公主長得像婿脸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柄驻,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348