iOS OC 轉(zhuǎn) Swift開發(fā)問題記錄
之前一直使用OC語言開發(fā)iOS應(yīng)用贤旷,時代在進步广料,使用Swift語言開發(fā)已成必然,本文僅作為自己轉(zhuǎn)換語言遇到問題的筆記幼驶,僅供參考性昭,理解不到位的地方還望各位看官指正。排序只依據(jù)遇到問題先后县遣,不以難易度做參考糜颠。
0 . 關(guān)于Swift語法學(xué)習(xí)
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)載請注明出處籽懦。