Swift Develop Tips

Xcode12模板位置:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates/iOS/Source/Cocoa Touch Class.xctemplate

1汗侵、設置導航欄為透明

self.navigationBar.setBackgroundImage(UIImage(), for: .default)
self.navigationBar.shadowImage = UIImage()
self.navigationBar.isTranslucent = true

2间雀、bridging-header是swift剛出的時候,官方提供一種混編的方式『鳎現在cocoapods 的版本已經支持swift 了宰睡,當你在安裝pods的時候,添加下面這句話.

# Uncomment this line if you're using Swift
use_frameworks!

它在cocoa pods中已經對Swift進行了配置气筋,所以可以直接使用,不需要創(chuàng)建bridging-header拆内。

推薦swift項目學習:
U17
LBXMLYFM-Swift

3、必要構造器

我們可以通過required關鍵字來實現必要構造器宠默,子類必須實現父類的必要構造器麸恍。

class Animal {
    var name: String
    required init(name: String) {
        self.name = name
    }
}

class Dog: Animal {
    var foot: Int
    //在重寫父類必要構造器的時候不需要加override
    required init(name: String) {
        foot = 4
        super.init(name: name)
    }
}

Dog(name: "dog")

有一點需要注意的就是:如果子類繼承的構造器能滿足必要構造器的要求,則無須在子類中顯式提供必要構造器的實現搀矫。

class Animal {
    var name: String
    required init(name: String) {
        self.name = name
    }
}

class Dog: Animal {
    var foot = 2
}

Dog(name: "dog")

在我們日常開發(fā)中抹沪,我們會經常自定義UITableViewCell的子類來實現我們定制化的需求刻肄,如果我們沒有實現required init?(coder aDecoder: NSCoder)方法的話,我們的代碼是編譯報錯的采够。查看文檔我們發(fā)現該方法為NSCoding的方法肄方,且該方法為UIView 必要構造器冰垄,所以它的子類必須實現該方法蹬癌。

class CustomTableViewCell: UITableViewCell {
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

4、訪問級別

Swift 為代碼中的實體提供了五種不同的訪問級別虹茶。這些訪問級別不僅與源文件中定義的實體相關逝薪,同時也與源文件所屬的模塊相關。

  • openpublic 級別可以讓實體被同一模塊源文件中的所有實體訪問蝴罪,在模塊外也可以通過導入該模塊來訪問源文件里的所有實體董济。通常情況下,你會使用 open 或 public 級別來指定框架的外部接口要门。open 和 public 的區(qū)別在后面會提到虏肾。

  • internal 級別讓實體被同一模塊源文件中的任何實體訪問,但是不能被模塊外的實體訪問欢搜。通常情況下封豪,如果某個接口只在應用程序或框架內部使用,就可以將其設置為 internal 級別炒瘟。

  • fileprivate 限制實體只能在其定義的文件內部訪問吹埠。如果功能的部分實現細節(jié)只需要在文件內使用時,可以使用 fileprivate 來將其隱藏疮装。

  • private 限制實體只能在其定義的作用域缘琅,以及同一文件內的 extension 訪問。如果功能的部分細節(jié)只需要在當前作用域內使用時廓推,可以使用 private 來將其隱藏刷袍。

open 為最高訪問級別(限制最少),private 為最低訪問級別(限制最多)樊展。

open 只能作用于類和類的成員做个,它和 public 的區(qū)別主要在于 open 限定的類和成員能夠在模塊外能被繼承和重寫,在下面的 子類 這一節(jié)中有詳解滚局。將類的訪問級別顯示指定為 open 表明你已經設計好了類的代碼居暖,并且充分考慮過這個類在其他模塊中用作父類時的影響。

5藤肢、pod不重新安裝已有的庫

pod install --no-repo-update

6太闺、swift 閉包 循環(huán)引用

參考鏈接:
Swift閉包循環(huán)引用
Swift與OC真正去理解Block解決循環(huán)引用的技巧

7、Swift 5.1 - 字符串

Swift 5.1 (3) - 字符串
iOS Swift中String的常用操作以及數據轉化

8嘁圈、tableView.deselectRow(at: indexPath, animated: true) 注意事項

這里不單單取消選中省骂,還會把cell所有的子控件設置為選中或者高亮

9蟀淮、VC的便利構造方法

convenience init(type: ContentType) {
        // 便利構造函數中 一定不會有super 對于屬性的賦值 一般在self.init()之后 只有self被初始化后,才能對其進行賦值, 不能使用let修飾屬性 var 并且告訴編譯器其強制解包 一定有值
        self.init()
        self.type = type
    }
    
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

10、實現TableView下拉關閉

let cv:CGFloat = -150 //下拉關閉數值
func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let offset = tableView.contentOffset.y;
        print(message: offset)
        if (offset < cv) {
             close()
        }
    }

11钞澳、關于UILabel設置AttributedString以后末尾...不出現的問題

需要重新設置一次label的lineBreakMode屬性

editLabel.attributedText = PublicTools.load_attributedString(model.editor_note.trimmingCharacters(in: .newlines), font: FMFont13, color: CFontColor8, alignment: .left, lineSpacing: kLabelSpace)
editLabel.lineBreakMode = .byTruncatingTail

12怠惶、當兩個UILabel并排顯示時,如何設置約束轧粟,讓A或者B能顯示你想要的需求策治,就需要用到下面兩個約束

ContentHuggingPriority ==> 表示當前的Label的內容不想被拉伸

playCountLabel.setContentHuggingPriority(UILayoutPriority(rawValue: 1000), for: .vertical)

ContentCompressionResistancePriority ==> 表示當前的Label的內容不想被收縮

playCountLabel.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 1000), for: .horizontal)

默認情況下: HuggingPriority == 250, CompressionResistancePriority == 750

12、@discardableResult的作用

在Swift中兰吟,當有返回值的方法未得到接收和使用時通常會出現警告
在正式編譯中不會影響編譯結果通惫,但是也妨礙代碼的美觀整潔,在方法上加上“@discardableResult”就可以取消這個警告

@discardableResult
 public func handleUrl(url: String, completion: 

還有一種取消警告的方法混蔼,不加@discardableResult直接加通配符接收方法返回值

_ = XX

13履腋、dynamic關鍵字

如果您有過OC的開發(fā)經驗,那一定會對OC中@dynamic關鍵字比較熟悉惭嚣,它告訴編譯器不要為屬性合成getter和setter方法遵湖。
Swift中也有dynamic關鍵字,它可以用于修飾變量或函數晚吞,它的意思也與OC完全不同延旧。它告訴編譯器使用動態(tài)分發(fā)而不是靜態(tài)分發(fā)。OC區(qū)別于其他語言的一個特點在于它的動態(tài)性载矿,任何方法調用實際上都是消息分發(fā)垄潮,而Swift則盡可能做到靜態(tài)分發(fā)。
因此闷盔,標記為dynamic的變量/函數會隱式的加上@objc關鍵字弯洗,它會使用OC的runtime機制。
雖然靜態(tài)分發(fā)在效率上可能更好逢勾,不過一些app分析統計的庫需要依賴動態(tài)分發(fā)的特性牡整,動態(tài)的添加一些統計代碼,這一點在Swift的靜態(tài)分發(fā)機制下很難完成溺拱。這種情況下逃贝,雖然使用dynamic關鍵字會犧牲因為使用靜態(tài)分發(fā)而獲得的一些性能優(yōu)化,但也依然是值得的迫摔。
使用動態(tài)分發(fā)沐扳,您可以更好的與OC中runtime的一些特性(如CoreData,KVC/KVO)進行交互句占,不過如果您不能確定變量或函數會被動態(tài)的修改沪摄、添加或使用了Method-Swizzle,那么就不應該使用dynamic關鍵字,否則有可能程序崩潰杨拐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末祈餐,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子哄陶,更是在濱河造成了極大的恐慌帆阳,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋吨,死亡現場離奇詭異蜒谤,居然都是意外死亡,警方通過查閱死者的電腦和手機离赫,發(fā)現死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門芭逝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塌碌,“玉大人渊胸,你說我怎么就攤上這事√ㄗ保” “怎么了翎猛?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長接剩。 經常有香客問我切厘,道長,這世上最難降的妖魔是什么懊缺? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任疫稿,我火速辦了婚禮,結果婚禮上鹃两,老公的妹妹穿的比我還像新娘遗座。我一直安慰自己,他們只是感情好俊扳,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布途蒋。 她就那樣靜靜地躺著,像睡著了一般馋记。 火紅的嫁衣襯著肌膚如雪号坡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天梯醒,我揣著相機與錄音宽堆,去河邊找鬼。 笑死茸习,一個胖子當著我的面吹牛畜隶,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼代箭,長吁一口氣:“原來是場噩夢啊……” “哼墩划!你這毒婦竟也來了?” 一聲冷哼從身側響起嗡综,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤乙帮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后极景,有當地人在樹林里發(fā)現了一具尸體察净,經...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年盼樟,在試婚紗的時候發(fā)現自己被綠了氢卡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡晨缴,死狀恐怖译秦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情击碗,我是刑警寧澤筑悴,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站稍途,受9級特大地震影響阁吝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜械拍,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一突勇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坷虑,春花似錦甲馋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至海蔽,卻和暖如春共屈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背党窜。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工拗引, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幌衣。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓矾削,卻偏偏與公主長得像壤玫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哼凯,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,790評論 25 707
  • 前言 在開發(fā)過程中断部,經常會碰到控制器對應的導航欄的背景顏色不一致或者需要讓導航欄背景透明的需求猎贴。在導航控制器pus...
    漸z閱讀 2,855評論 0 8
  • 發(fā)現 關注 消息 iOS 第三方庫、插件蝴光、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 當使用aotoLayout約束UIView時她渴,若切換橫豎屏幕時發(fā)生自動拉伸現象,此時可在UIView的以下方法中禁...
    ylcoder閱讀 1,469評論 0 2
  • 準備食材:豆腐一塊蔑祟,肉沫少量趁耗,香蔥幾棵切碎,蒜泥少量疆虚,青椒紅椒少量切碎苛败。 ① 將豆腐切小塊3cm小正方體。 ② 用...
    透明的蝶閱讀 315評論 0 1