**iOS OC** 轉(zhuǎn) **Swift**開發(fā)問題記錄

iOS OC 轉(zhuǎn) Swift開發(fā)問題記錄

之前一直使用OC語言開發(fā)iOS應(yīng)用贤旷,時代在進步广料,使用Swift語言開發(fā)已成必然,本文僅作為自己轉(zhuǎn)換語言遇到問題的筆記幼驶,僅供參考性昭,理解不到位的地方還望各位看官指正。排序只依據(jù)遇到問題先后县遣,不以難易度做參考糜颠。

0 . 關(guān)于Swift語法學(xué)習(xí)

Swift語法教程參考

1. [****unowned self****]

使用閉包時,經(jīng)常需要考慮循環(huán)應(yīng)用的問題萧求,在swift中其兴,解決該問題比較簡單,使用閉包捕獲列表[unowned self] 或 [weak self]

區(qū)別:

  • 如果捕獲(比如 self)可以被設(shè)置為 nil夸政,也就是說它可能在閉包前被銷毀元旬,那么就要將捕獲定義為 weak
  • 如果它們一直是相互引用,即同時銷毀的守问,那么就可以將捕獲定義為 unowned

參考鏈接:http://www.reibang.com/p/22b0057c0cfb

[unowned self] : 在閉包中經(jīng)常使用來解決循環(huán)引用的問題匀归。 當我們確定兩個對象屬于相互引用的情況,而且二者需要銷毀的時機是一樣的耗帕,那么就可以用 例如:viewController 對tableView強引用穆端,tableView強擁有tableViewCell,而二者是需要在 vc銷毀的時候,同時銷毀的仿便,那么cell里面的點擊事件通過閉包傳到vc時就可以用[unowned self]

[weak self] : 也可以用來解決循環(huán)引用体啰,其他的作用,以我目前的知識還沒有意識到嗽仪。 [ weak self] 時self 可能是為nil的荒勇,最常見的crash是,當我們在一個下拉刷新請求數(shù)據(jù)時闻坚,再網(wǎng)絡(luò)請求還沒有完成時沽翔,就立刻退出當前頁面,那么vc就被銷毀了窿凤,網(wǎng)絡(luò)請求完成的閉包再用self(這里不僅僅是像self發(fā)送消息仅偎,因為像nil發(fā)送消息不會造成崩潰)就會造成crash

————————————————

版權(quán)聲明:本文為CSDN博主「aasdsjk」的原創(chuàng)文章西潘,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明哨颂。

原文鏈接:https://blog.csdn.net/u011315300/article/details/80206047

swift 中一個類可以嵌套定義另外類喷市,新增加的類只能被當前類使用

在 swift 中,要解除閉包的 循環(huán)引用威恼,可以在閉包定義中使用 [unowned self] 或者 [weak self]品姓,其中:

[unowned self] 類似與 OC 中的 unsafe_unretained,如果對象被釋放箫措,仍然保留一個 無效引用腹备,不是可選項

[weak self] 類似與 OC 中的 __weak,如果對象被釋放斤蔓,自動指向 nil植酥,更安全

[weak self] 時時監(jiān)控性能較差,[unowned self]可能導(dǎo)致野指針錯誤弦牡,如果能夠確定對象不會被釋放友驮,盡量使用 unowned

————————————————

版權(quán)聲明:本文為CSDN博主「anchoriteFili」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議驾锰,轉(zhuǎn)載請附上原文出處鏈接及本聲明卸留。

原文鏈接:https://blog.csdn.net/github_33467146/article/details/81126963

2.guard

個人理解為與if功能類似,當不滿足判斷條件是走else之后的代碼塊椭豫,相比if來說耻瑟,一些邏輯叛亂更加直觀

————————一下引用自網(wǎng)絡(luò)

那么guard到底是什么作用呢?顧名思義赏酥,guard是作為保衛(wèi)作用而存在的喳整。當你不滿足我的要求,那么請您出去裸扶;如果滿足框都,則執(zhí)行下一步操作。

-guard與if相比好在哪里

uard可以把不符合條件的處理事件前置姓言,以免程序猿在開發(fā)中有遺漏的情況出現(xiàn)瞬项。

guard還可以減少條件語句中的嵌套數(shù)量,使代碼更簡潔易讀何荚。

-guard 的具體用法

電影院檢票的例子:

//票務(wù)

struct Ticket

{

  var movieName:String//該場電影名字

  var  TimeValid:Bool  =  true//電影票有效

}

func  checkTicket(ticket:Ticket?,currentMovieName:String)

{

guard  let  _  = ticket,ticket?.movieName == currentMovieName else {

  print("非此場電影")

  return

 }

guard ticket?.TimeValid  else {

  print("該票已過期")

  return

 }

  //TODO:

  print("可以看電影了")

}

參考鏈接:http://www.reibang.com/p/3f9af8946b61

Tip :

書籍推薦:跟戴銘學(xué)iOS編程:理順核心知識點

《跟戴銘學(xué)iOS編程:理順核心知識點》適合對 iOS 有興趣的開發(fā)人員學(xué)習(xí),也適合經(jīng)驗豐富的 iOS 開發(fā)者和對編程語言本身有興趣的人員參考猪杭。(初學(xué)者不推薦餐塘,僅供參考)

3.****擴展(****Extensions****)

項目中使用的最多的就是擴展協(xié)議(UITableViewDelegate,UITableViewDataSource 等)

以下下為官方文檔中文描述:

擴展可以給一個現(xiàn)有的類皂吮,結(jié)構(gòu)體戒傻,枚舉税手,還有協(xié)議添加新的功能。它還擁有不需要訪問被擴展類型源代碼就能完成擴展的能力(即逆向建模)需纳。擴展和 Objective-C 的分類很相似芦倒。(與 Objective-C 分類不同的是,Swift 擴展是沒有名字的不翩。)

Swift 中的擴展可以:

  • 添加計算型實例屬性和計算型類屬性
  • 定義實例方法和類方法
  • 提供新的構(gòu)造器
  • 定義下標
  • 定義和使用新的嵌套類型
  • 使已經(jīng)存在的類型遵循(conform)一個協(xié)議

在 Swift 中兵扬,你甚至可以擴展協(xié)議以提供其需要的實現(xiàn),或者添加額外功能給遵循的類型所使用口蝠。你可以從 協(xié)議擴展 獲取更多細節(jié)器钟。

注意

擴展可以給一個類型添加新的功能,但是不能重寫已經(jīng)存在的功能妙蔗。

擴展的語法

使用 extension 關(guān)鍵字聲明擴展:

extension SomeType {

// 在這里給 SomeType 添加新的功能

}

擴展可以擴充一個現(xiàn)有的類型傲霸,給它添加一個或多個協(xié)議。協(xié)議名稱的寫法和類或者結(jié)構(gòu)體一樣:

extension SomeType: SomeProtocol, AnotherProtocol {

// 協(xié)議所需要的實現(xiàn)寫在這里

}

參考鏈接:http://www.swift51.com/swift5.1/02_language_guide/20_Extensions.html

4.Swift****中****Self****和****self****的區(qū)別

當編寫protocol和針對protocol進行擴展時眉反,Self(大寫S)和self(小寫S)之間存在差異昙啄。當與大寫S一起使用時,Self指的是符合協(xié)議的類型寸五,例如String或Int跟衅。當與小寫S一起使用時,self指的是該類型內(nèi)的值播歼,例如“hello”或556伶跷。

例如,請考慮以下擴展BinaryInteger:

extension BinaryInteger {

 func squared() -> Self {

 return self * self

 }

記住秘狞,Self大寫字母S指的是符合協(xié)議的任何類型叭莫。在上面的例子中,Int符合BinaryInteger烁试,所以在調(diào)用Int方法時返回一個Int雇初。

在另一方面,self用小寫小號是指任何值的類型成立减响。如果在Int存儲值5時調(diào)用上面的示例靖诗,則實際上是這樣5 * 5。

注意:“Self”僅在協(xié)議中可用支示,或者作為類中方法的結(jié)果

參考鏈接 : http://www.reibang.com/p/eff457d90464

怎么用

綜上可看出對于Self來說它只是表示特定類型刊橘,并且只能用在協(xié)議中或者作為某個類的方法的返回值類型,而self在實例方法中代指當前實例颂鸿,在類方法中則代指當前類促绵。

參考鏈接 :http://www.reibang.com/p/5059d2993509

5.Swift****中的自動布局第三方庫****——SnapKit

SnapKit,一個經(jīng)典的Swift版的第三方庫,專門用于項目的自動布局败晴,類似OC 中的 Masonry浓冒,用法差異也不大,上手難度低

示例:

let testView =  UIView()

 testView.backgroundColor =  UIColor.cyan

 view.addSubview(testView)

 testView.snp.makeConstraints { (make) in

 make.width.equalTo(100) // 寬為100

 make.height.equalTo(100) // 高為100

 make.center.equalTo(view) // 位于當前視圖的中心

 }

6.DZNEmptyDataSet——空白數(shù)據(jù)集顯示框架

GitHub: DZNEmptyDataSet

參考鏈接:http://www.reibang.com/p/f70dc3e0f436

7.JTSegmentControl

自定義SegmentControl尖坤,動態(tài)調(diào)節(jié)寬度稳懒、滾動位置,紅點

http://www.west999.com/www/info/81454-1.htm

GitHub: https://github.com/guangzhouxia/JTSegmentControl

8.didSet

項目中cell賦值model時常用慢味,可以在這個方法中更新view

willSet可以帶一個newName的參數(shù)场梆,沒有的話,該參數(shù)默認命名為newValue贮缕。

didSet可以帶一個oldName的參數(shù)辙谜,表示舊的屬性,不帶的話默認命名為oldValue感昼。

屬性初始化時装哆,willSet和didSet不會調(diào)用。只有在初始化上下文之外定嗓,當設(shè)置屬性值時才會調(diào)用蜕琴。

即使是設(shè)置的值和原來值相同,willSet和didSet也會被調(diào)用

參考鏈接:http://www.reibang.com/p/fafc24262e1e

9.設(shè)置拉伸圖片

 backgroundImageView = UIImageView()

  **var** image = UIImage.init(named: "catering_vouchers_bg_2")

  //設(shè)置拉伸圖片時宵溅,需要用來填充拉伸位置的部分

  **let** insets = UIEdgeInsets(top: (image?.size.height)!/2  +  10, left: 10, bottom: 10, right: 10)

  // 指定為拉伸模式凌简,伸縮后重新賦值

 image = image?.resizableImage(withCapInsets: insets, resizingMode: .stretch)

backgroundImageView.image = image

10.****swift 計算文字的寬高

  // 計算文字高度

 func getTextRectSize(text:NSString,font:UIFont,size:CGSize) -> CGRect {

 let attributes = [NSFontAttributeName: font]

 let option = NSStringDrawingOptions.UsesLineFragmentOrigin

 let rect:CGRect = text.boundingRectWithSize(size, options: option, attributes: attributes, context: nil)

  // println("rect:\(rect)");

  return rect;

 }

11.HandyJSON

Swift: 實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON

參考鏈接 : http://www.reibang.com/p/e9d933ce7c74

12.JNStarRateView

swift星星評分控件

項目中用到的星星評分

demo地址:https://github.com/yinjining/StarRateView

參考鏈接 :http://www.reibang.com/p/ea88987a7e87?nomobile=yes

13.swift 富文本

和OC使用上一致

推薦這個extension

http://www.reibang.com/p/54d55a77cc3d

14.Swift 整數(shù)相除返回保留兩位小數(shù)的浮點數(shù)

兩個Int型的數(shù)相除,要先轉(zhuǎn)換為Float恃逻,然后再進行運算,用String的構(gòu)造方法保留兩位小數(shù)雏搂,再將String轉(zhuǎn)換為Float

 let num1 = 12345

 let str = String(format: "%.2f", Float(num1)/1000)

 let num2 = Float(str)

 print(num2!)

參考自:

————————————————

版權(quán)聲明:本文為CSDN博主「yingBi2014」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議寇损,轉(zhuǎn)載請附上原文出處鏈接及本聲明凸郑。

原文鏈接:https://blog.csdn.net/yingBi2014/article/details/80199169

15.Initializer for conditional binding must have Optional type, not ‘String'

嘗試引入 Foundation 框架解決

16.swift 顏色漸變

實現(xiàn)漸變有兩種方式

1.CAGradientLayer

2.Core Graphics

這里就說下CAGradientLayer,這是最簡單的.

 var gradientLayer = CAGradientLayer()

//幾個顏色

 gradientLayer.colors = [UIColor.hexadecimalColor(hexadecimal: "0x7BC1E5").cgColor,UIColor.hexadecimalColor(hexadecimal: "0x68C3BA").cgColor]

//顏色的分界點

 gradientLayer.locations = [0.2,1.0]

//開始

 gradientLayer.startPoint = CGPoint.init(x: 0, y: 0)

//結(jié)束,主要是控制漸變方向

 gradientLayer.endPoint = CGPoint.init(x: 1.0, y: 0)

//多大區(qū)域

 gradientLayer.frame = CGRect.init(x: 0, y: 0, width: kScreen_Width, height: kph(px: 185).floatValue())

//最后作為背景

 view.layer.insertSublayer(gradientLayer, at: 0)

作者:李某lkb

鏈接:http://www.reibang.com/p/a216a2062d58

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)矛市,非商業(yè)轉(zhuǎn)載請注明出處芙沥。

17.Kingfisher

Swift中的圖片處理庫Kingfisher

鏈接:http://www.reibang.com/p/fa2624ac1959

18.****scenedelegate****配置

如果我們不開發(fā)iPadOS多窗口APP,SceneDelegate窗口管理我們可以不需要直接刪掉就好了浊吏。

iOS 13 SceneDelegate適配

參考鏈接:https://blog.csdn.net/weixin_38735568/article/details/101266408

19.swift****中****? 而昨、****! ??

可選類型 可以不用初始化,如果不是可選類型找田,必須在init下進行初始化歌憨。保證在調(diào)用的時候不是nil

可選類型在調(diào)用的時候必須加上?或者!,聲明的時候用的午阵!的可以不加躺孝,表明你認定這個對象再使用的時候肯定不會為nil享扔,也可以加底桂?不會報錯

作者:smalldu

鏈接:http://www.reibang.com/p/d710184e62ca

來源:簡書

著作權(quán)歸作者所有植袍。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處籽懦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末于个,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子暮顺,更是在濱河造成了極大的恐慌厅篓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捶码,死亡現(xiàn)場離奇詭異羽氮,居然都是意外死亡,警方通過查閱死者的電腦和手機惫恼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門档押,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祈纯,你說我怎么就攤上這事令宿。” “怎么了腕窥?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵粒没,是天一觀的道長。 經(jīng)常有香客問我簇爆,道長癞松,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任入蛆,我火速辦了婚禮响蓉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘安寺。我一直安慰自己厕妖,他們只是感情好,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布挑庶。 她就那樣靜靜地躺著言秸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迎捺。 梳的紋絲不亂的頭發(fā)上举畸,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天凳枝,我揣著相機與錄音抄沮,去河邊找鬼跋核。 笑死,一個胖子當著我的面吹牛叛买,可吹牛的內(nèi)容都是我干的砂代。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼率挣,長吁一口氣:“原來是場噩夢啊……” “哼刻伊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起椒功,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捶箱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后动漾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丁屎,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年旱眯,在試婚紗的時候發(fā)現(xiàn)自己被綠了晨川。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡键思,死狀恐怖础爬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吼鳞,我是刑警寧澤看蚜,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站赔桌,受9級特大地震影響供炎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疾党,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一音诫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雪位,春花似錦竭钝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至时肿,卻和暖如春庇茫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背螃成。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工旦签, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留查坪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓宁炫,卻偏偏與公主長得像偿曙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淋淀,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355