Swift技能總結

技能 1. 關于自定義標記

對于OC中 我們想在DEBUG狀態下做事情,但是不在 RELease中實現的時候,我們一般是定義宏,來實現,一般寫在.pch文件中. 代碼如下

#ifdef DEBUG
#define LXLLog(...) NSLog(@"%s\n %@\n\n", __func__, [NSString stringWithFormat:__VA_ARGS__])
#else
#endif

對于Swift中,由于沒有了宏定義這個一個功能,我們只能自己建造標記來定義,什么時候是 DEBUG,什么時候是RELEASE. 可以利用 方法來定義 對用的console 語句

// T指泛型,可由可無,任意類型. 此方法,可以輸出對應的文件, 方法名, 以及行號
func LXLLog<T>(message: T, file: String = __FILE__, method: String = __FUNCTION__, line: Int = __LINE__)
{
    #if LXL_DEBUG
        print("\((file as NSString).lastPathComponent)[\(line)], \(method): \(message)")
    #endif
}

但只是定義這么一個語句是不被使用的, 對已這個帶有標記的語句, 要進行再Swift中注冊說明

Snip20160504_2.png

技能2: 關于SBRefrence 也就是 Storyboard refrence的使用

Snip20160504_5.png

Snip20160504_6.png

Snip20160504_7.png

對于SBRefrence 的使用比較好, 可以很好的改變程序的結構,但是又不影響程序的正常使用.

技能3: Swift中main函數的消失

官方解釋:
In Xcode, Mac templates default to including a “main.swift” file, but for iOS apps the default for new iOS project templates is to add @UIApplicationMain to a regular Swift file. This causes the compiler to synthesize a mainentry point for your iOS app, and eliminates the need for a “main.swift” file.

Swift項目中添加了@UIApplicationMain 到swift文件中,使得編譯器合成了一個app入口,所以不需要main.swift文件


Snip20160504_9.png

當然我們也可以手動創建程序的入口 main 函數:
1.注銷掉 @UIApplicationMain

Snip20160504_10.png

2.手動創建名字為main的文件

Snip20160504_11.png
import Foundation
import UIKit
  UIApplicationMain(Process.argc, Process.unsafeArgv, NSStringFromClass(UIApplication), NSStringFromClass(AppDelegate))

`

技能4: 對于便利構造器(比較方便的構造器, convenience)的使用

對已一般對象的初始化, 我們經常使用 init() 進行初始化, 當然有時候我們會進行 對已經初始化的對象 添加新的屬性, 對于 便利構造器而言, 添加屬性可以重寫 init()方法進行添加, 這種以 init 方法開頭的重寫方法, 在Swift中我們稱之為 便利構造器, 它的使用必須 調用本類的指定構造器 也就是 必須 對本類所有 屬性進行初始化才可以使用.
Swift中 對于以 init()作為初始化的方法, 沒有返回值, 默認返回self, OC中是有返回值得, 并且確保 已經初始化父類屬性,才可以使用

還有一種構造方法稱之為 中 , 內部創建對象, 并且對于對象的屬性進行初始化, 并返回對象, 起始就是 對象建立的過程, 進行了二次封裝而已

/*
        如果想給系統的類新增構造方法, 那么只能新增一個便利構造方法
        如果構造方法是以 init 開頭, 那么該構造方法是一個指定構造方法
        如果構造器方法的 init 前面還有 convenience, 那么這個構造方法 就是一個 遍歷構造方法
        
        指定構造器和 便利構造 區別:
        指定構造器:
            必須初始化當前類的所有屬性
        便利構造器:
            不用初始化當前類的所有屬性, 但是它依賴于當前類中的其他構造方法 -- >其他構造方法已經 進行了類的初始化
        在開發中, 不要隨便定義便利構造器,只有需要提供一個方法快速
    */
    convenience init(imageName: String , backgroudImageName: String){
        self.init()
        setImage(UIImage(named: imageName), forState: .Normal)
        setImage(UIImage(named: imageName + "_highlighted"), forState: .Highlighted)
        setBackgroundImage(UIImage(named: backgroudImageName), forState: .Normal)
        setBackgroundImage(UIImage(named: backgroudImageName + "_highlighted"), forState: .Highlighted)
        sizeToFit()
    }

技能4. 命名空間的使用

對于Swift中不可以根據字符串來創建對應的類, 必須借助于命名空間才可以創建對應的類 其中格式有: "空間名稱"+"."+"類名" 并且確定類名必須存在才可.

當然OC中可以直接創建. 因為OC沒有空間命名這么一個概念, 所有文件之間沒有聯系, 只能通過 導入 import 才可以使用

但是Swift中, 在同一個project中處于相同的工作空間, 具有相同的命名空間,對于新創建的類, 必須確定其命名空間才可以使用
這個命名空間 一般就是 自己創建應用的名稱
命名空間是哪一個那? 圖例說明:

Snip20160506_1.png

代碼中的獲取:

  // 1. 獲取當前應用程序的命名空間
// 在info 中 查詢 對應 "CFBundleExecutable"的值,取出, 這里使用 guard 是為了解包. 
        guard let nsp = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as? String else{
            return
        }
        print(nsp)

獲取到 對應的命名空間, 就可以 建立對應的 類的對象了, 這里并不是簡單的獲取類名而已 , 由字符串創建對應的類

 // 注意: 在Swift中想通過字符串創建類, 必須加上命名空間
        guard let cls: AnyClass = NSClassFromString(nsp + "." + (childControllerName ?? "")) else{
            return
        }

使用類創建對象, 必須先進行類的對象, 說明類的類型, 方可使用,,, as

guard let clsType = cls as? UIViewController.Type else {
            return
        }
// 對于這種以類型 進行創建的對象, 只能使用 init() 創建
        let childController = clsType.init()

此時, 已經創建對應類型的 控制器, 可以進行使用了

技能5: 動態加載控制器. OC Swift 都可以使用

這里所用的思想, 就是 對于控制器的加載, 不能僅僅 依靠的固定的模式, 要將其統一到一個可以控制器的文件中 進行加載, 這樣我們 只要通過改變文件, 就可以改變控制器的加載, 讓程序處于不同的展示. 對于這樣的情況, 我們可以讓程序 下載對應的控制器文件, 然后根據文件 加載對應的控制器, 這里我們需要考慮網速的問題, 但是, 如果沒有網, 我們加載個屁

我們通過 plist文件進行加載:
這里我不在重復說明plist文件中 JSON 數組的組成 , 對于Swift創建空文件,內部進行填充數據即可.

Snip20160506_2.png
// 1.獲取JSON文件路徑
        let path = NSBundle.mainBundle().pathForResource("MainVCSettings", ofType: "json")!
// 2.加載JSON數據
 let data = NSData(contentsOfFile: path)!
// 3.序列號JSON數據, 這里使用try? 來捕獲異常,發生異常返回null, 使用guard,來解包,沒有解包返回else
 guard let objc = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) else {
            addChildViewController("HomeTableViewController", title: "首頁", imageName: "tabbar_home")
            addChildViewController("MessageTableViewController", title: "消息", imageName: "tabbar_message_center")
            addChildViewController("NullViewController", title: "", imageName: "")
            addChildViewController("DiscoverTableViewController", title: "發現", imageName: "tabbar_discover")
            addChildViewController("ProfileTableViewController", title: "我", imageName: "tabbar_profile")
            return
        }
// 4. 類型確認
 guard let array = objc as? [[String: AnyObject]] else {
            return
        }
// 遍歷 創建
    for dict in array {
            addChildViewController(dict["vcName"] as? String, title: dict["title"] as? String, imageName: dict["imageName"] as? String  
        }

技能6: 對于自定義控件中的問題 code創建問題

這里需要說明, 對于初始化控件, 一般都是兩種方式: 1. 純代碼, 2. xib 或者SB創建.

required init?(coder aDecoder: NSCoder) {
//        fatalError("init(coder:) has not been implemented")
        super.init(coder: aDecoder)
        setup()
    }

上述方法中 注銷的語句,指的是致命錯誤方法,, 會直接導致應用的崩潰的
因為在Swift中, 推薦要么使用純代碼,要么使用文件進行創建
一旦我注銷掉, 就意味著, 兩種方式我都可以進行創建的

Snip20160506_3.png

技能7: 核心動畫的使用. CABaseAnimation

同OC用法一致, 先設置需要 改變的屬性:
animationWithKeyPath: ""
這里有多個屬性和一進行選擇:

transform.scale = 比例轉換

    transform.scale.x = 闊的比例轉換

    transform.scale.y = 高的比例轉換

    transform.rotation.z = 平面圖的旋轉

    opacity = 透明度

    margin

    zPosition

    backgroundColor    背景顏色

    cornerRadius    圓角

    borderWidth

    bounds

    contents

    contentsRect

    cornerRadius

    frame

    hidden

    mask

    masksToBounds

    opacity

    position

    shadowColor

    shadowOffset

    shadowOpacity

    shadowRadius

fromValue , 起始動畫位置
toVaue: 終止動畫位置
removedOnCompletion: 動畫完成后是否回到起始狀態, 也有防止動畫中斷的意思在理面
duration: 動畫時長
repeatCount: 動畫重復次數

動畫創建完畢后就能加入圖層了

func startAnimation() {
        // 1.創建動畫
        let anim = CABasicAnimation(keyPath: "transform.rotation")
        
        // 2.設置動畫屬性
        anim.toValue = 2 * M_PI
        anim.duration = 5.0
        anim.repeatCount = MAXFLOAT
        
        // 告訴系統不要自動移除動畫
        anim.removedOnCompletion = false
        
        // 3.將動畫添加到圖層
        imageView.layer.addAnimation(anim, forKey: nil)
    }

技能8: 對于分類的建立

對于OC中 , 有專門的分類建立, Category.
但是對于Swift中, 建立分類必須自己建立獨立文件, 自己填寫繼承

Snip20160509_1.png

因為Swift 是全局性的文件創建, 命名空間,只有加入特定詞匯 private, 才能是私有屬性, 所以這里的 分類,可以說是分類, 也可以說是繼承吧, 對于此種的方法, 同分類的使用方法是一樣的.
對于一些合并類屬性, 以及一些可以封裝類屬性, 皆可以用分類組成, 也可以用自定義組成.

對于分類 和 繼承, 一個重要的區別就是, 繼承是重寫已經有的方法, 分類是為了添加沒有的方法

技能9: 對于Swift盡量使用SB, 不要使用xib

Swift 中 要求盡量使用sb 去 圖形化創建界面 而不要使用xib', 這點從 launch由以前的 xib到現在的 sb 就可以看得出來
這一點又有一些矛盾, 對于創建過程 , 先找xib 在進行純碼創建

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,142評論 4 61
  • 我的朋友 他是個詩人 他說 不能說的 都入詩 森林里 樹洞里 滿滿都是 他不能言說的秘密 時間久了 樹干都長滿了木...
    俺就是那只貓閱讀 317評論 3 5
  • 早晨,我和老公一起送孩子去學校。到了一個十字路口,紅燈轉成了綠燈,老公和兒子三歩并兩步往過沖。慢性子的我猶豫地看著...
    天長地久京閱讀 273評論 1 2
  • 寒風你不要從天山上下來 寒風你不要吹過塔城 也不要吹倒了麥子 要溫柔對待大地上的一切 不要把小孩子的風箏吹遠了 不...
    逗霸君閱讀 221評論 2 6
  • 今天介紹一些值得推薦的芭蕾服飾品牌。 1、三沙(sansha) 三沙雖自稱法國品牌,但價格也就比國產品牌貴一點,質...
    長頸小獅閱讀 2,567評論 0 2