關(guān)于Swift學(xué)習(xí)及開(kāi)發(fā)中會(huì)遇到的小問(wèn)題集錦(1)

這些問(wèn)題及回答氓侧,都?xì)w納至泊學(xué)用戶群瓢喉,是大家在平日的學(xué)習(xí)工作過(guò)程中遇到的各種小問(wèn)題摹蘑,以及解答渺鹦!將會(huì)持續(xù)更新


Q:
請(qǐng)教一下這句話的意思扰法?

Paste_Image.png

我現(xiàn)在

Paste_Image.png

做了兩個(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里,這樣

Paste_Image.png

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)存中

Paste_Image.png

A:

Paste_Image.png

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)的方法”

Paste_Image.png

A:

Paste_Image.png

然后,實(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)型

Paste_Image.png

就類(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:

  1. 如果你要處理很大的文件上傳袍镀,你的App至少要有一個(gè)專(zhuān)門(mén)的UI來(lái)處理吧默蚌?否則你不僅你不知道,用戶豈不是也很蒙圈~
  2. 多線程和返回Home之后仍舊可以上傳是兩回事苇羡;
  3. 如果想系統(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ù)的

Paste_Image.png

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

Paste_Image.png

A:
先想明白到底想咋樣

  1. 按照你第一個(gè)圖的結(jié)果痰洒,你需要的參數(shù)分明是一個(gè)值瓢棒,不是一個(gè)函數(shù);
  2. 按照你第二個(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:

  1. Tuple不再可以傳給接受和Tuple元素同樣的函數(shù)作為參數(shù)辈讶;
  2. 接受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)型

Paste_Image.png

總之 as 更多的含義就是單詞 as飞醉,轉(zhuǎn)型的意味不重


Q:
swift能捕獲 exception么,不是error type
A:
Swift里的異常就是任何實(shí)現(xiàn)了ErrorProtocol的類(lèi)型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市屯阀,隨后出現(xiàn)的幾起案子缅帘,更是在濱河造成了極大的恐慌,老刑警劉巖难衰,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钦无,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盖袭,警方通過(guò)查閱死者的電腦和手機(jī)失暂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鳄虱,“玉大人弟塞,你說(shuō)我怎么就攤上這事∽疽眩” “怎么了决记?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)倍踪。 經(jīng)常有香客問(wèn)我系宫,道長(zhǎng),這世上最難降的妖魔是什么建车? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任扩借,我火速辦了婚禮,結(jié)果婚禮上癞志,老公的妹妹穿的比我還像新娘往枷。我一直安慰自己,他們只是感情好凄杯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布错洁。 她就那樣靜靜地躺著,像睡著了一般戒突。 火紅的嫁衣襯著肌膚如雪屯碴。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天膊存,我揣著相機(jī)與錄音导而,去河邊找鬼忱叭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛今艺,可吹牛的內(nèi)容都是我干的韵丑。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼虚缎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撵彻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起实牡,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陌僵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后创坞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碗短,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年题涨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偎谁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纲堵,死狀恐怖搭盾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婉支,我是刑警寧澤鸯隅,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站向挖,受9級(jí)特大地震影響蝌以,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜何之,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一跟畅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溶推,春花似錦徊件、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辐赞,卻和暖如春部翘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背响委。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工新思, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窖梁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓夹囚,卻偏偏與公主長(zhǎng)得像纵刘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荸哟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容