這些問(wèn)題及回答氓侧,都?xì)w納至泊學(xué)用戶群瓢喉,是大家在平日的學(xué)習(xí)工作過(guò)程中遇到的各種小問(wèn)題摹蘑,以及解答渺鹦!將會(huì)持續(xù)更新
Q:
請(qǐng)教一下這句話的意思扰法?
我現(xiàn)在
做了兩個(gè)頁(yè)面的跳轉(zhuǎn) 但是代碼過(guò)去了 界面沒(méi)過(guò)去
哦原來(lái)是時(shí)間問(wèn)題 不能在viewDidLoad 里面直接跳轉(zhuǎn)頁(yè)面。毅厚。 swift 還有什么事件 可以知道頁(yè)面加載完成啊 塞颁?
A:
切換UI總要有個(gè)什么外部事件吧,例如資源加載完成卧斟?用戶選擇了跳過(guò)殴边?或者是什么其他的
總不能VC加載完了就立刻切
Q:swift 如何怎么打印變量地址 什么符號(hào)
A:在Swift 3里,這樣
Q:為什么singleton 能這么寫(xiě) static let shareInstance = XXX()
我自己 理解是 shareInstance 用static修飾 是一個(gè)類(lèi)分配一塊空間
像Class這種 是不是 用Static修飾 就是在里面 開(kāi)設(shè)一塊永久空間 存在 屬性 和方法珍语?
A:
這里沒(méi)有所謂里面锤岸、外面的說(shuō)法,static屬性不是類(lèi)對(duì)象的一部分板乙。他就是一個(gè)在內(nèi)存里獨(dú)立存在的對(duì)象是偷。
Q:我加上static 和不加static 屬性 a 的內(nèi)存地址 都是一個(gè)
按你說(shuō)的 a 加上static 修飾 應(yīng)該 存放在static 單獨(dú)的那塊內(nèi)存中
A:
static屬性不是類(lèi)對(duì)象的一部分
就從你剛才的例子其實(shí)也能看出來(lái)了,a和b的地址也不連續(xù)
Q:
extension Rational: Equatable {} func == (lhs: Rational, rhs: Rational) -> Bool {
為什么==的實(shí)現(xiàn)要寫(xiě)在extension外面呢募逞?
求教~蛋铆。。放接。
A:
其實(shí)刺啦,重載運(yùn)算符定義在Global,而不定義為method纠脾,這是一個(gè)編程語(yǔ)言設(shè)計(jì)中的慣用形式玛瘸。為什么是這樣呢?在C++里苟蹈,當(dāng)我們把 == 重載在類(lèi)方法內(nèi)部時(shí)糊渊,就會(huì)強(qiáng)制 == 的左操作數(shù)一定是類(lèi)對(duì)象,而不是和這個(gè)類(lèi)對(duì)象“等價(jià)”的某種形式的其他值慧脱。但這樣是違背相等操作語(yǔ)義的渺绒。因此,為了讓 值 == 對(duì)象 和 對(duì)象 == 值 都可以生效。諸如 賦值宗兼、比較這樣的二元操作符重載躏鱼,都定義成Global function。這樣针炉,編譯器就可以處理上述交換的問(wèn)題了挠他。
Q:
有個(gè)疑問(wèn),關(guān)于protocol中函數(shù)不能包含默認(rèn)值篡帕,對(duì)下面這句話不太理解:“當(dāng)protocol中的方法帶有參數(shù)時(shí)殖侵,參數(shù)是不能有默認(rèn)值的。如果我們希望把“提供有默認(rèn)參數(shù)版本的方法”也作為一種約定镰烧,我們只能像下面這樣單獨(dú)定義一個(gè)不帶任何參數(shù)的方法拢军。例如我們要添加一個(gè)生成引擎名稱(chēng)的方法”
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)值是不行的
所以,沒(méi)啥特別的需要却舀,可以不用這么干虫几,直接在實(shí)現(xiàn)的時(shí)候,讓參數(shù)有默認(rèn)值就好了
Q:
用as 做casting得到一定是個(gè)optional?
意思是 as 和 as? 是同樣意思嗎禁筏?
A:
準(zhǔn)確的講,type casting是沒(méi)法用 as 的
要不用as? optional轉(zhuǎn)衡招,要不 as! force cast
as 可以用在case語(yǔ)句里篱昔,例如 case str as String 這樣,判斷某個(gè)Any 或 AnyObject 是否可以作為 某種具體的類(lèi)型
就類(lèi)似這樣的用法
總之 as 更多的含義就是單詞 as,轉(zhuǎn)型的意味不重
Q:
請(qǐng)教有可能從uiimage 判讀原本圖片的格式是png 或jpg嗎州刽? 轉(zhuǎn)回nsdata 再判斷頭一個(gè)byte 在swift貌似無(wú)用
A:
UIImageJPEGRepresentation / UIImagePNGRepresentation 可以判斷
Q:
求教 IOS里面 用ALAMOFire 上傳 我需要把線程卡住嗎空执? 還是說(shuō)它直接后臺(tái)上傳了不用管了。 按了HOME都沒(méi)問(wèn)題穗椅?
A:
...回去到上傳的請(qǐng)求了隨意操作啊辨绊,為什么要卡線程
Q:
如果是很大的文件怎么半 要是不成功 用戶也不知道。 原來(lái)都是寫(xiě)B(tài)S架構(gòu)的匹表。 這種情況要怎么處理懊趴馈?
A:
- 如果你要處理很大的文件上傳袍镀,你的App至少要有一個(gè)專(zhuān)門(mén)的UI來(lái)處理吧默蚌?否則你不僅你不知道,用戶豈不是也很蒙圈~
- 多線程和返回Home之后仍舊可以上傳是兩回事苇羡;
- 如果想系統(tǒng)后臺(tái)上傳绸吸,注冊(cè)是一個(gè)backgroundSession就行了。然后在handleEventsForBackgroundURLSession里设江,處理事件锦茁;
Q:
主要是 如果用戶使用Home建 然后在內(nèi)存里面關(guān)掉了APP這種操作 要怎么處理?
這種情況有事件出來(lái)嗎叉存? 還是說(shuō)要自己下次啟動(dòng)的時(shí)候驗(yàn)證是否成功码俩?
A:
這種操作木有處理,系統(tǒng)也不會(huì)通知
你這個(gè)問(wèn)題涉及到復(fù)雜的線程控制
當(dāng)耗時(shí)很久的線程啟動(dòng)后鹉胖,你需要有一種機(jī)制能讓它提前終止
Q:
那就是說(shuō) 要自己驗(yàn)證問(wèn)題了握玛。 本地要寫(xiě)進(jìn)度記錄。 不知道alamofire 能不能斷點(diǎn)續(xù)傳甫菠? 不行就重新上傳吧挠铲。。
A:
代碼可能是這樣的寂诱。
ui拂苹,開(kāi)始下載:thread.start() ui,終止下載:thread.stop() 線程的代碼: function stop() { terminated = true } 線程的工作函數(shù): function working() { while (!terminated) { ....... } }
Q:
求教 將函數(shù) 作為參數(shù) 要怎么寫(xiě)啊 這個(gè)函數(shù)有參數(shù)的
我這樣寫(xiě)報(bào)錯(cuò)
A:
先想明白到底想咋樣
- 按照你第一個(gè)圖的結(jié)果痰洒,你需要的參數(shù)分明是一個(gè)值瓢棒,不是一個(gè)函數(shù);
- 按照你第二個(gè)圖的結(jié)果丘喻,你需要傳遞一個(gè)Closure脯宿,而不是一個(gè)真實(shí)的函數(shù)調(diào)用;
如果參數(shù)是個(gè)Closure泉粉,說(shuō)明你需要的是實(shí)現(xiàn)過(guò)程连霉;如果參數(shù)是個(gè)值榴芳,說(shuō)明你需要的是結(jié)果;
在函數(shù)參數(shù)的地方聲明個(gè)Clousre跺撼,在函數(shù)調(diào)用的時(shí)候窟感,傳遞結(jié)果。歉井。柿祈。
這就很尷尬了
不用在里面寫(xiě)參數(shù)類(lèi)型 直接是把函數(shù)名當(dāng)參數(shù)就行
Q:
有人知道為何appencontentof 吃一個(gè)string array 的variable 會(huì)報(bào)錯(cuò)嗎?
A:
因?yàn)檎{(diào)用contentOf的時(shí)候有一個(gè)要求哩至,就是參數(shù)序列中的元素類(lèi)型躏嚎,必須和原數(shù)組中元素類(lèi)型一樣,但是String和AnyObject不一樣憨募,所以把一個(gè)Array<String>變量傳遞給Array<AnyObject>應(yīng)該是不行的紧索。至于字面值為什么可以。我覺(jué)得是當(dāng)那個(gè)字面值用在函數(shù)參數(shù)那個(gè)位置做type inference的時(shí)候菜谣,自動(dòng)推導(dǎo)成Array<AnyObject>了珠漂,因?yàn)橹挥羞@樣編譯才能通過(guò)
但是你在定義oo的時(shí)候,顯然不會(huì)推導(dǎo)成Array<AnyObject>
Q:
另外這中我發(fā)現(xiàn)一個(gè)問(wèn)題有點(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
處理完,再?gòu)腛C runtime里抓谴,COPY到Swift
我是這么理解的暮蹂。。癌压。仰泻。
Q:
這樣bridge效率會(huì)差一點(diǎn)嗎?
A:
會(huì)的滩届。
Q:
swift 里面有類(lèi)似pch的功能嗎集侯?
A:
Swift里,就不需要pch...
swift是分模塊的帜消,模塊內(nèi)不需要import棠枉,模塊間才需要。整個(gè)app是一個(gè)模塊泡挺。
Q:
3.0元組有變化么
A:
- Tuple不再可以傳給接受和Tuple元素同樣的函數(shù)作為參數(shù)辈讶;
- 接受Tuple參數(shù)、接受和Tuple元素類(lèi)型相同參數(shù)的函數(shù)娄猫,將被明確識(shí)別為兩個(gè)獨(dú)立的函數(shù)類(lèi)型贱除。
Q:
用as 做casting得到一定是個(gè)optional?
意思是 as 和 as? 是同樣意思嗎咳促?
A:
準(zhǔn)確的講,type casting是沒(méi)法用 as 的
要不用as? optional轉(zhuǎn)勘伺,要不 as! force cast
as 可以用在case語(yǔ)句里,例如 case str as String 這樣褂删,判斷某個(gè)Any 或 AnyObject 是否可以作為 某種具體的類(lèi)型
總之 as 更多的含義就是單詞 as飞醉,轉(zhuǎn)型的意味不重
Q:
swift能捕獲 exception么,不是error type
A:
Swift里的異常就是任何實(shí)現(xiàn)了ErrorProtocol的類(lèi)型