swift-基礎(chǔ)-進(jìn)階2

分類(lèi)

  • 新建一個(gè)空的Swift文件(一般命名比如String+Exrension),直接用extension來(lái)寫(xiě)即可辣辫。
  • 可以在一個(gè)文件里寫(xiě)多個(gè)分類(lèi)
extension String

{

    // MARK: - 沙盒路徑

    func cachesDir() -> String {

        let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!

        

        let lastName = (self as NSString).lastPathComponent

        

        let filePath = (path as NSString).stringByAppendingPathComponent(lastName)

        return filePath

    }

    

    func documentDir() -> String {

        let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!

        

        let lastName = (self as NSString).lastPathComponent

        

        let filePath = (path as NSString).stringByAppendingPathComponent(lastName)

        return filePath

    }

    

    func tmpDir() -> String {

        let path = NSTemporaryDirectory()

        

        let lastName = (self as NSString).lastPathComponent

        

        let filePath = (path as NSString).stringByAppendingPathComponent(lastName)        

        return filePath

    }

}

命名空間

  • 注意:如果想通過(guò)一個(gè)字符串創(chuàng)建一個(gè)類(lèi)犹赖,那么必須加上命名空間,否則創(chuàng)建出來(lái)的是nil
let aClass : AnyClass = NSClassFromString("XMGWeibo." + "HomeViewController")!
  • 直接把命名空間寫(xiě)死比較low徒役,比較好的做法是動(dòng)態(tài)獲取。直接去info.plist獲取即可
        // 從info.plist動(dòng)態(tài)獲取命名空間

       // 這里通過(guò)key去字典取值窖壕,取到的是anyObject類(lèi)型的忧勿,是可選類(lèi)型杉女。要對(duì)其操作必須解包。這里用guard來(lái)解包
        guard let name = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] else

        {

            KSLog("name為空")

            return

        }

        // 拼接命名空間.類(lèi)名
        // NSClassFromString返回的類(lèi)型是AnyClass?

        let aClass: AnyClass? = NSClassFromString("\(name)."+controllerName)
  • 注意:如果出現(xiàn)aClass為nil的情況鸳吸,先去設(shè)置一下APP的名字熏挎,build settings -> Product Name和Product Module Name

Swift中的類(lèi)

  • AnyObject:相當(dāng)于OC中的id,表示所有class類(lèi)型的數(shù)據(jù)晌砾;所有繼承于NSObject的類(lèi)都隱式地實(shí)現(xiàn)了protocol Anyobjct協(xié)議坎拐,所以他可以表示所有class類(lèi)型
    • 小知識(shí)點(diǎn):Swift中的數(shù)組Array和String類(lèi)并不繼承于A(yíng)nyObject,而是一個(gè)結(jié)構(gòu)體养匈,所以不能用Anyobject表示
    • 字典/數(shù)組只能存儲(chǔ)對(duì)象哼勇,所以通過(guò)一個(gè)key從字典中獲取值取出來(lái)的是一個(gè)AnyObject類(lèi)型。并且有可能取不到呕乎,所以最終類(lèi)型是AnyObject?
  • Any:所有的基本數(shù)據(jù)類(lèi)型积担,包括enum/struct都可以用Any來(lái)表示
    • 小知識(shí)點(diǎn):Swift中可以寫(xiě)let array:[AnyObject] = ["abc",1],而不報(bào)錯(cuò)猬仁,看似和上面的說(shuō)法矛盾帝璧,其實(shí)array里的屬性已經(jīng)被默認(rèn)轉(zhuǎn)換成OC里的數(shù)據(jù)類(lèi)型了
  • AnyClass:用來(lái)表示元類(lèi)型(任意類(lèi)的類(lèi)型),它的內(nèi)部實(shí)現(xiàn)是:typealias AnyClass = AnyObject.Type湿刽。
  • .Type的意思是用于獲取類(lèi)的元類(lèi)型聋溜。類(lèi)如Person.Type就代表獲取Person的元類(lèi)型
  • .self:如果通過(guò)類(lèi)名調(diào)用,那么可以獲取該類(lèi)的類(lèi)型叭爱,說(shuō)白了就是獲取自己
    • 類(lèi)似于OC中[UITableViewCell Class]
  • 于是可以這么寫(xiě):let typeP : Person.Type = Person.self,意思是用Person類(lèi)型的變量typeP把Person這個(gè)類(lèi)保存起來(lái)撮躁;然后可以用typeP調(diào)用Person的類(lèi)方法。比如typeP.say(),效果和Person.say()是一樣的买雾。為什么要多此一舉呢把曼?主要是用于解耦:外界傳入一個(gè)類(lèi),可以用這個(gè)方法把這個(gè)類(lèi)保存起來(lái)然后調(diào)用類(lèi)方法漓穿,如果直接Person調(diào)用嗤军,那么就寫(xiě)死了

回到上面的命名空間問(wèn)題

  • 上面創(chuàng)建了一個(gè)AnyClass類(lèi)型的aClass變量,但如果打印它晃危,會(huì)發(fā)現(xiàn)什么都沒(méi)有叙赚,因?yàn)橄到y(tǒng)還不知道它的具體類(lèi)型的,所以必須將他轉(zhuǎn)換為已知的類(lèi)型僚饭,再調(diào)用init()方法創(chuàng)建
  • 直白的說(shuō)震叮,Swift中如果想通過(guò)一個(gè)Class來(lái)創(chuàng)建一個(gè)對(duì)象,必須告訴系統(tǒng)這個(gè)Class的確切類(lèi)型
// 根據(jù)完整類(lèi)名創(chuàng)建控制器鳍鸵,這里aClass要強(qiáng)轉(zhuǎn)成UIViewController類(lèi)型的才能用init方法
// aClass是可選類(lèi)型苇瓣,這里用guard來(lái)解包
guard let classType = aClass as? UIViewController.Type else{

    return

}

let childViewController = classType.init()

異常

  • Swift中的異常機(jī)制不一樣。OC中一般發(fā)生錯(cuò)誤會(huì)給傳入的指針賦值偿乖,而Swift中使用的是異常處理機(jī)制
  • 凡是有throws的方法击罪,那么必須進(jìn)行try catch處理
  • 只有do里面的代碼發(fā)生了錯(cuò)誤哲嘲,才會(huì)執(zhí)行catch里的代碼
  • try :正常處理異常,也就是通過(guò)do catch來(lái)處理
  • try! :告訴系統(tǒng)一定不會(huì)有異常媳禁,也就是說(shuō)可以不通過(guò)do catch來(lái)處理眠副。但開(kāi)發(fā)中不推薦這么寫(xiě)
  • try? :告訴系統(tǒng)可能有錯(cuò),也可能沒(méi)錯(cuò)竣稽。如果沒(méi)錯(cuò)囱怕,系統(tǒng)會(huì)自動(dòng)將結(jié)果包裝成一個(gè)可選類(lèi)型返回,如果有錯(cuò)丧枪,系統(tǒng)會(huì)返回nil光涂。如果使用了try?庞萍,也可以不通過(guò)do catch來(lái)處理
// filePath是根據(jù)一個(gè)key來(lái)取值的拧烦,可能不存在,是可選類(lèi)型钝计,需要解包

        guard let filePath = NSBundle.mainBundle().pathForResource("MainVCSetting.json", ofType: nil) else

        {

            KSLog("JSON文件不存在")

            return

        }

        // data也是可選類(lèi)型恋博。如果不用guard處理,用alt點(diǎn)擊可以看到有個(gè)問(wèn)號(hào)私恬。(用guard處理了就看不到了)

        guard let data = NSData(contentsOfFile: filePath) else

        {

            KSLog("加載二進(jìn)制數(shù)據(jù)失敗")

            return

        }

       
        do

        { // json轉(zhuǎn)對(duì)象债沮,順便強(qiáng)轉(zhuǎn)為字典數(shù)組類(lèi)型

            let obj = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as! [[String: AnyObject]]

            

            for dict in obj {
                // 上面的字典里value是AnyObject類(lèi)型,需要強(qiáng)轉(zhuǎn)為String

                let title = dict["title"] as? String

                let VcName = dict["vcName"] as? String

                let imageName = dict["imageName"] as? String

                addChildViewController(VcName, title: title, imageName: imageName)

            }

        }catch

        {

            KSLog("接受服務(wù)器控制器數(shù)據(jù)失敗,顯示默認(rèn)控制器")

            addChildViewController("HomeController", title: "首頁(yè)", imageName: "tabbar_home")

            addChildViewController("MessageController", title: "消息", imageName: "tabbar_message_center")

            addChildViewController("DiscoverController", title: "發(fā)現(xiàn)", imageName: "tabbar_discover")

            addChildViewController("ProfileController", title: "我", imageName: "tabbar_profile")

        }

        

        // 這里的obj是個(gè)可選類(lèi)型本鸣,如果出錯(cuò)疫衩,那么是nil

        let obj1 = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)

        // 這里如果出錯(cuò),那么直接崩

        let obj2 = try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)

斷言

  • 與異常有類(lèi)似的作用荣德,用于告訴使用者闷煤,某個(gè)值不能為空。如果為空涮瞻,直接崩潰并且打印錯(cuò)誤信息
assert(access_token != nil, "使用loadUserInfo()方法前必須先授權(quán)")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲤拿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子署咽,更是在濱河造成了極大的恐慌近顷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宁否,死亡現(xiàn)場(chǎng)離奇詭異窒升,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)慕匠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)异剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人絮重,你說(shuō)我怎么就攤上這事冤寿〈蹩啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵督怜,是天一觀(guān)的道長(zhǎng)殴瘦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)号杠,這世上最難降的妖魔是什么蚪腋? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮姨蟋,結(jié)果婚禮上屉凯,老公的妹妹穿的比我還像新娘。我一直安慰自己眼溶,他們只是感情好悠砚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著堂飞,像睡著了一般灌旧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绰筛,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天枢泰,我揣著相機(jī)與錄音,去河邊找鬼铝噩。 笑死衡蚂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骏庸。 我是一名探鬼主播毛甲,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼敞恋!你這毒婦竟也來(lái)了丽啡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硬猫,失蹤者是張志新(化名)和其女友劉穎补箍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體啸蜜,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坑雅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衬横。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裹粤。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜂林,靈堂內(nèi)的尸體忽然破棺而出遥诉,到底是詐尸還是另有隱情拇泣,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布矮锈,位于F島的核電站霉翔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苞笨。R本人自食惡果不足惜债朵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瀑凝。 院中可真熱鬧序芦,春花似錦、人聲如沸粤咪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)射窒。三九已至藏杖,卻和暖如春将塑,著一層夾襖步出監(jiān)牢的瞬間脉顿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工点寥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艾疟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓敢辩,卻偏偏與公主長(zhǎng)得像蔽莱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戚长,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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