Swift3.0初級入門(Objective-C轉(zhuǎn)Swift的一些坑)

一.前言

為什么要學(xué)Swift呢栗恩?作為蘋果開發(fā)應(yīng)該都知道,以后可能是使用Swift來開發(fā)iOS App了(雖然洪燥,Swift原作者貌似跳槽到了特斯拉磕秤,但是這不是我們需要關(guān)心的八卦),當(dāng)然也可能使用H5+Native捧韵,不管怎么樣市咆,這篇文章要說的是Swift。(黑人?臉)

二.經(jīng)歷實踐得出的一些經(jīng)驗

(1)初始化

1.子類重寫父類初始化器需要添加Override關(guān)鍵字
2.自定義的指定初始化器里需要先保證當(dāng)前類所有儲存屬性都有初始值再来,然后才能調(diào)用父類指定初始化器
3.自定義指定初始化器系統(tǒng)就不會添加默認初始化器蒙兰。PS:UIViewController里面并沒有init()初始化器磷瘤,所以子類的init()初始化器算是自定義的初始化器
4.帶required關(guān)鍵字的都需要子類重寫
5.子類繼承了父類指定的初始化器,就可以調(diào)用父類里調(diào)用該指定初始化器的便利初始化器

(2)搜变?vs ! vs ??

?:可選類型采缚,可以為nil,不會報運行時錯誤挠他。

var name: String?    //nil
name = "Jashion"
print("\(name!)")

!:可選強制類型扳抽,如果值為nil時會報運行時錯誤;如果對象一單初始化則一直會有值殖侵,則可以用!摔蓝。

var name: String! = "Jashion"
let jashion = name!
print("\(jashion)")

??:判斷符,比如:a ?? b愉耙,如果a為nil則返回b,否則返回a拌滋。

let result: String? = nil ?? "Jashion"
print("\(result!)") .   //Jashion

(3)as vs as? vs as!

as: 使用場合

1.向上轉(zhuǎn)型朴沿,從派生類轉(zhuǎn)換為基類
class SuperClass {
    var name: String? = "Jashion"
}
class SubClass: SuperClass {
    var number: Int? = 10
}
let subClass = SubClass()
let superClass = subClass as SuperClass
superClass.name .   //Jashion
superClass.number    //Error

2.消除二義性,比如數(shù)值轉(zhuǎn)換
let floatNum = 42 as CGFloat
let intNum = 42 as Int
let intNum2 = (42/5) as Int
let doubleNum = (42/5) as Double

3.switch語句中進行模式匹配(如果不知道一個對象是什么類型败砂,可以通過switch語法檢測它的類型赌渣,并且嘗試在不同的情況下使用對應(yīng)的類型進行相應(yīng)的處理)
let animal: Animal = Cat()
switch animal {
case let cat as Cat:
    print("cat")
case let dog as Dog:
    print("dog")
default:
    break
}

總的來說,左邊是右邊的子類或者是同類才能轉(zhuǎn)換昌犹,就是只能向上轉(zhuǎn)型坚芜。

as?使用場合

向下轉(zhuǎn)型(Downcasting)時使用。如果轉(zhuǎn)換不成功則返回nil斜姥,不會報運行時錯誤鸿竖。
let animal: Animal = Cat()
if let cat = animal as? Dog {
    print(cat)
} else {
    print("something")     //something
}

as!使用場合

和as?使用差不多,不過是強制轉(zhuǎn)換铸敏,如果為nil則會報運行時錯誤缚忧。
Class Animal{}
Class Cat: Animal{}
let animal: Animal = Cat()
let cat = animal as! Cat

(4)is vs as

is只是單單判斷該對象是不是某個類型的實例
as不僅僅判斷類型,如果是該類型還會強制轉(zhuǎn)換成該類型

let cat: Cat = Cat()
let animal = cat as Animal     //Animal
let isCat = cat is Cat    //true

(5)mutating可變類型

枚舉和結(jié)構(gòu)體是值類型杈笔,和OC不一樣闪水,枚舉和結(jié)構(gòu)體可以定義自己的方法,但是蒙具,默認情況下方法不能修改值類型的屬性球榆。在方法之前添加mutating關(guān)鍵字可以在方法中修改值類型的屬性。

struct Person {
    var name: String = "Tome"
    var score: Int = 99
    mutating func changeScore() {
        score = score+12
    }
}

(6)類方法

在方法func前面添加關(guān)鍵字static禁筏,來指定類方法持钉。添加class關(guān)鍵字來允許子類重寫父類的類方法。

class Animal {
    static func animal() {
        print("Is animal!")
    }
    
    class func animalName(_ name: String) {
        print("Animal is \(name)")
    }
}

Animal.animal()
Animal.animalName("Cat")

class Cat: Animal {
    override static func animalName(_ name: String) {
        print("Animal is \(name)")
    }
}

(7)Swift訪問控制

Swift訪問控制級別遵循一個基本原則:不允許將實體定義在限制性更強的實體內(nèi)篱昔。

class Animal {
    var name: string?
}

public var cat = Animal()
//error: variable cannot be declared public because its type 'Animal' uses an internal type

public func animal(_ animal: Animal) {}
//error: function cannot be declared public because its parameter uses an internal type

public func animal() -> Animal {}
//error: function cannot be declared public because its result uses an internal type

訪問級別從開放到私有排序:
open > public > internal > fileprivate > private

1.private

訪問級別最低右钾,只能類內(nèi)部訪問

class A {
     private fund test() {
          print(“this is private function!")
     }
}

class B: A {
     fun show {
          test() //Error:只能類內(nèi)部訪問
     }
}
2.fileprivate

在當(dāng)前的源文件都可以訪問。

//demo.swift
class A {
     fileprivate func test() {
          print(“this is private function!")
     }
}

class B: A {
     fun show {
          test() //Right
     }
}
3.internal(默認訪問級別,不需要額外設(shè)置舀射。)

internal訪問級別所修飾的屬性或者方法在源代碼所在的整個模塊內(nèi)部都可以訪問窘茁,比如:整個App,某個框架脆烟。

4.public

可以被任何人訪問山林,但是其他模塊中,不可以繼承和重寫邢羔,模塊內(nèi)可以被繼承和重寫

5.open

可以被任何人訪問驼抹,繼承和重寫

(8)對于調(diào)用的函數(shù)有返回值但是本身不需要使用可以使用“-”代替。

_ = self.navigationController?.popViewController(animated: true)

(9)添加seletor

backButton.addTarget(self, action: #selector(DetailViewController.back), for: .touchUpInside)
//DetailViewController是類名拜鹤,back是方法
//如果需要調(diào)用的是私有方法框冀,則需要在私有方法前面添加@objc字段

(10)寫轉(zhuǎn)場動畫的坑(Push/Pop)

//動畫開始的函數(shù)調(diào)用順序
Objective-C:init()->loadView()->animationControllerForOperation()->animateTransition
swift:  init()->animationControllerForOperation()->loadView()->animateTransition

//因為我的轉(zhuǎn)場動畫需要用到下一個scene的imageView,所以控制器的視圖必須初始化敏簿,然后就發(fā)現(xiàn)Swift和Objective-C函數(shù)的調(diào)用順序不同明也,略坑

三.總結(jié)

初次使用Swift的感覺就是,很強大惯裕,很簡潔温数,但是,正因為強大蜻势,細節(jié)上注意的東西比較多撑刺,很多東西其實上手也需要時間,比如握玛,現(xiàn)在我都對Swift的閉包不是弄的很懂够傍,雖然和Objective-C的block差不多,但是還是有區(qū)別的挠铲⊥醮總而言之,路還很漫長市殷。
最后愕撰,獻上自己用Swift寫的轉(zhuǎn)場動畫Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末醋寝,一起剝皮案震驚了整個濱河市搞挣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌音羞,老刑警劉巖囱桨,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嗅绰,居然都是意外死亡舍肠,警方通過查閱死者的電腦和手機搀继,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翠语,“玉大人叽躯,你說我怎么就攤上這事〖±ǎ” “怎么了点骑?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谍夭。 經(jīng)常有香客問我黑滴,道長,這世上最難降的妖魔是什么紧索? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任袁辈,我火速辦了婚禮,結(jié)果婚禮上珠漂,老公的妹妹穿的比我還像新娘晚缩。我一直安慰自己丈氓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布俗孝。 她就那樣靜靜地躺著婚被,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涩嚣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音滋觉,去河邊找鬼。 笑死齐邦,一個胖子當(dāng)著我的面吹牛椎侠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播措拇,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼我纪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丐吓?” 一聲冷哼從身側(cè)響起浅悉,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎券犁,沒想到半個月后术健,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡粘衬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年荞估,在試婚紗的時候發(fā)現(xiàn)自己被綠了咳促。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡勘伺,死狀恐怖跪腹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情娇昙,我是刑警寧澤尺迂,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站冒掌,受9級特大地震影響噪裕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜股毫,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一膳音、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铃诬,春花似錦祭陷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宣肚,卻和暖如春想罕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霉涨。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工按价, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笙瑟。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓楼镐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親往枷。 傳聞我的和親對象是個殘疾皇子框产,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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

  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,476評論 0 4
  • 擴展 擴展就是向一個已有的類错洁、結(jié)構(gòu)體茅信、枚舉類型或者協(xié)議類型添加新功能。這包括在沒有權(quán)限獲取原始源代碼的情況下擴展類...
    cht005288閱讀 467評論 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,819評論 1 10
  • 那個霎那間墓臭,累從心中來蘸鲸。越久到年增一歲,越無法提筆窿锉。 熱淚滾滾酌摇,能灼傷所有的愛恨情仇膝舅,嗔癡貪。 在某一刻窑多,因一句話...
    1穎閱讀 625評論 0 0
  • 早餐:雞蛋一枚仍稀,蘋果半顆,牛奶一杯 中餐:飯菜八分埂息,不吃肉食 晚餐:小米粥技潘,水果
    06d12fe83199閱讀 112評論 0 0