這些問題及回答,都?xì)w納至泊學(xué)用戶群,是大家在平日的學(xué)習(xí)工作過程中遇到的各種小問題,以及解答!將會(huì)持續(xù)更新
Q:
請(qǐng)教一下這句話的意思?

我現(xiàn)在

做了兩個(gè)頁面的跳轉(zhuǎn) 但是代碼過去了 界面沒過去
哦原來是時(shí)間問題 不能在viewDidLoad 里面直接跳轉(zhuǎn)頁面。。 swift 還有什么事件 可以知道頁面加載完成啊 ?
A:
切換UI總要有個(gè)什么外部事件吧,例如資源加載完成?用戶選擇了跳過?或者是什么其他的
總不能VC加載完了就立刻切
Q:swift 如何怎么打印變量地址 什么符號(hào)
A:在Swift 3里,這樣

Q:為什么singleton 能這么寫 static let shareInstance = XXX()
我自己 理解是 shareInstance 用static修飾 是一個(gè)類分配一塊空間
像Class這種 是不是 用Static修飾 就是在里面 開設(shè)一塊永久空間 存在 屬性 和方法?
A:
這里沒有所謂里面、外面的說法,static屬性不是類對(duì)象的一部分。他就是一個(gè)在內(nèi)存里獨(dú)立存在的對(duì)象。
Q:我加上static 和不加static 屬性 a 的內(nèi)存地址 都是一個(gè)
按你說的 a 加上static 修飾 應(yīng)該 存放在static 單獨(dú)的那塊內(nèi)存中

A:

static屬性不是類對(duì)象的一部分
就從你剛才的例子其實(shí)也能看出來了,a和b的地址也不連續(xù)
Q:
extension Rational: Equatable {} func == (lhs: Rational, rhs: Rational) -> Bool {
為什么==的實(shí)現(xiàn)要寫在extension外面呢?
求教~。。。
A:
其實(shí),重載運(yùn)算符定義在Global,而不定義為method,這是一個(gè)編程語言設(shè)計(jì)中的慣用形式。為什么是這樣呢?在C++里,當(dāng)我們把 == 重載在類方法內(nèi)部時(shí),就會(huì)強(qiáng)制 == 的左操作數(shù)一定是類對(duì)象,而不是和這個(gè)類對(duì)象“等價(jià)”的某種形式的其他值。但這樣是違背相等操作語義的。因此,為了讓 值 == 對(duì)象 和 對(duì)象 == 值 都可以生效。諸如 賦值、比較這樣的二元操作符重載,都定義成Global function。這樣,編譯器就可以處理上述交換的問題了。
Q:
有個(gè)疑問,關(guān)于protocol中函數(shù)不能包含默認(rèn)值,對(duì)下面這句話不太理解:“當(dāng)protocol中的方法帶有參數(shù)時(shí),參數(shù)是不能有默認(rèn)值的。如果我們希望把“提供有默認(rèn)參數(shù)版本的方法”也作為一種約定,我們只能像下面這樣單獨(dú)定義一個(gè)不帶任何參數(shù)的方法。例如我們要添加一個(gè)生成引擎名稱的方法”

A:

然后,實(shí)現(xiàn)的時(shí)候,讓f1的實(shí)現(xiàn)用一個(gè)期望的默認(rèn)值。。。。
這樣,f1 看上去就跟可以有一個(gè)默認(rèn)參數(shù)一樣
如果要把提供默認(rèn)值變成一種強(qiáng)制行為,就那樣定義在protocol里
否則,實(shí)現(xiàn)的時(shí)候自己整也行
Q:
?強(qiáng)制行為?實(shí)現(xiàn)A的時(shí)候f1也可以不設(shè)置默認(rèn)參數(shù)啊,如何實(shí)現(xiàn)強(qiáng)制呢?
A:
這個(gè)有點(diǎn)兒trick.....如果你像上面那樣定義了protocol,在實(shí)現(xiàn)它的時(shí)候,就必須要定義兩個(gè)版本的 f1,一個(gè)帶參數(shù);一個(gè)不帶任何參數(shù)
而你在實(shí)現(xiàn)的時(shí)候,讓帶參數(shù)的版本有默認(rèn)值是不行的
所以,沒啥特別的需要,可以不用這么干,直接在實(shí)現(xiàn)的時(shí)候,讓參數(shù)有默認(rèn)值就好了
Q:
用as 做casting得到一定是個(gè)optional?
意思是 as 和 as? 是同樣意思嗎?
A:
準(zhǔn)確的講,type casting是沒法用 as 的
要不用as? optional轉(zhuǎn),要不 as! force cast
as 可以用在case語句里,例如 case str as String 這樣,判斷某個(gè)Any 或 AnyObject 是否可以作為 某種具體的類型

就類似這樣的用法
總之 as 更多的含義就是單詞 as,轉(zhuǎn)型的意味不重
Q:
請(qǐng)教有可能從uiimage 判讀原本圖片的格式是png 或jpg嗎? 轉(zhuǎn)回nsdata 再判斷頭一個(gè)byte 在swift貌似無用
A:
UIImageJPEGRepresentation / UIImagePNGRepresentation 可以判斷
Q:
求教 IOS里面 用ALAMOFire 上傳 我需要把線程卡住嗎? 還是說它直接后臺(tái)上傳了不用管了。 按了HOME都沒問題?
A:
...回去到上傳的請(qǐng)求了隨意操作啊,為什么要卡線程
Q:
如果是很大的文件怎么半 要是不成功 用戶也不知道。 原來都是寫B(tài)S架構(gòu)的。 這種情況要怎么處理?。?br>
A:
- 如果你要處理很大的文件上傳,你的App至少要有一個(gè)專門的UI來處理吧?否則你不僅你不知道,用戶豈不是也很蒙圈~
- 多線程和返回Home之后仍舊可以上傳是兩回事;
- 如果想系統(tǒng)后臺(tái)上傳,注冊是一個(gè)backgroundSession就行了。然后在handleEventsForBackgroundURLSession里,處理事件;
Q:
主要是 如果用戶使用Home建 然后在內(nèi)存里面關(guān)掉了APP這種操作 要怎么處理?
這種情況有事件出來嗎? 還是說要自己下次啟動(dòng)的時(shí)候驗(yàn)證是否成功?
A:
這種操作木有處理,系統(tǒng)也不會(huì)通知
你這個(gè)問題涉及到復(fù)雜的線程控制
當(dāng)耗時(shí)很久的線程啟動(dòng)后,你需要有一種機(jī)制能讓它提前終止
Q:
那就是說 要自己驗(yàn)證問題了。 本地要寫進(jìn)度記錄。 不知道alamofire 能不能斷點(diǎn)續(xù)傳? 不行就重新上傳吧。。
A:
代碼可能是這樣的。
ui,開始下載:thread.start() ui,終止下載:thread.stop() 線程的代碼: function stop() { terminated = true } 線程的工作函數(shù): function working() { while (!terminated) { ....... } }
Q:
求教 將函數(shù) 作為參數(shù) 要怎么寫啊 這個(gè)函數(shù)有參數(shù)的

我這樣寫報(bào)錯(cuò)

A:
先想明白到底想咋樣
- 按照你第一個(gè)圖的結(jié)果,你需要的參數(shù)分明是一個(gè)值,不是一個(gè)函數(shù);
- 按照你第二個(gè)圖的結(jié)果,你需要傳遞一個(gè)Closure,而不是一個(gè)真實(shí)的函數(shù)調(diào)用;
如果參數(shù)是個(gè)Closure,說明你需要的是實(shí)現(xiàn)過程;如果參數(shù)是個(gè)值,說明你需要的是結(jié)果;
在函數(shù)參數(shù)的地方聲明個(gè)Clousre,在函數(shù)調(diào)用的時(shí)候,傳遞結(jié)果。。。
這就很尷尬了
不用在里面寫參數(shù)類型 直接是把函數(shù)名當(dāng)參數(shù)就行
Q:
有人知道為何appencontentof 吃一個(gè)string array 的variable 會(huì)報(bào)錯(cuò)嗎?
A:
因?yàn)檎{(diào)用contentOf的時(shí)候有一個(gè)要求,就是參數(shù)序列中的元素類型,必須和原數(shù)組中元素類型一樣,但是String和AnyObject不一樣,所以把一個(gè)Array<String>變量傳遞給Array<AnyObject>應(yīng)該是不行的。至于字面值為什么可以。我覺得是當(dāng)那個(gè)字面值用在函數(shù)參數(shù)那個(gè)位置做type inference的時(shí)候,自動(dòng)推導(dǎo)成Array<AnyObject>了,因?yàn)橹挥羞@樣編譯才能通過
但是你在定義oo的時(shí)候,顯然不會(huì)推導(dǎo)成Array<AnyObject>
Q:
另外這中我發(fā)現(xiàn)一個(gè)問題有點(diǎn)弄不清楚,String是一個(gè)struct吧?一個(gè) struct array顯然不是AnyObject compatible,但為何[String] 是一個(gè) AnyObject ?
A:
因?yàn)楫?dāng)String要轉(zhuǎn)換成一個(gè)AnyObject的時(shí)候,在數(shù)組中存放的時(shí)候,這個(gè)行為是bridge到OC runtime完成的
本質(zhì)上就是一個(gè) NSArray 里面存了 NSString
處理完,再從OC runtime里,COPY到Swift
我是這么理解的。。。。
Q:
這樣bridge效率會(huì)差一點(diǎn)嗎?
A:
會(huì)的。
Q:
swift 里面有類似pch的功能嗎?
A:
Swift里,就不需要pch...
swift是分模塊的,模塊內(nèi)不需要import,模塊間才需要。整個(gè)app是一個(gè)模塊。
Q:
3.0元組有變化么
A:
- Tuple不再可以傳給接受和Tuple元素同樣的函數(shù)作為參數(shù);
- 接受Tuple參數(shù)、接受和Tuple元素類型相同參數(shù)的函數(shù),將被明確識(shí)別為兩個(gè)獨(dú)立的函數(shù)類型。
Q:
用as 做casting得到一定是個(gè)optional?
意思是 as 和 as? 是同樣意思嗎?
A:
準(zhǔn)確的講,type casting是沒法用 as 的
要不用as? optional轉(zhuǎn),要不 as! force cast
as 可以用在case語句里,例如 case str as String 這樣,判斷某個(gè)Any 或 AnyObject 是否可以作為 某種具體的類型

總之 as 更多的含義就是單詞 as,轉(zhuǎn)型的意味不重
Q:
swift能捕獲 exception么,不是error type
A:
Swift里的異常就是任何實(shí)現(xiàn)了ErrorProtocol的類型