Some Notes on Developing iOS 11 Apps with Swift(1)

本文為大地瓜原創(chuàng)筝蚕,歡迎知識(shí)共享媒怯,轉(zhuǎn)載請(qǐng)注明出處赠制。
雖然你不注明出處我也沒(méi)什么精力和你計(jì)較赶袄。
作者微信號(hào):christgreenlaw


大地瓜在學(xué)習(xí)Stanford University的Developing iOS 11 Apps with Swift.
這里記錄了一些小筆記僚碎。這部分是前三節(jié)猴娩。

這篇文章并不是這個(gè)教程的全部?jī)?nèi)容,只是大地瓜自己學(xué)習(xí)過(guò)程中想記錄的一部分內(nèi)容。


swift的optional是為了兼容OC的卷中,optional有兩個(gè)狀態(tài)矛双,set 和 not set。也就是要么有值要么無(wú)值蟆豫。使用感嘆號(hào)表示我們假定其一定有值议忽,但如果你這樣做了,加了感嘆號(hào)十减,但其實(shí)本身無(wú)值栈幸,在訪問(wèn)時(shí)應(yīng)用就會(huì)崩潰掉。問(wèn)號(hào)則表示不保證有值帮辟,只是一個(gè)普通的optional速址。


struct和class在Swift中幾乎是一樣的東西。都有ivar由驹,都有method
主要有以下兩個(gè)區(qū)別:

  1. struct沒(méi)有繼承關(guān)系壳繁。
  2. struct是value type,class 是 reference type
    數(shù)組荔棉、字典、int蒿赢、string等等都是struct

value type是什么意思润樱?

值類(lèi)型在傳遞時(shí)會(huì)被拷貝。(Swift并不會(huì)無(wú)腦拷貝羡棵,只會(huì)將有修改的部分拷貝壹若,也就是copy-on-write)
引用類(lèi)型傳遞時(shí),傳遞的可以認(rèn)為是指針皂冰,使用的還是同一個(gè)對(duì)象店展。

  1. struct會(huì)默認(rèn)得到一個(gè)init,其參數(shù)列表列出了所有的ivar秃流。class得到的默認(rèn)init只會(huì)是沒(méi)有參數(shù)列表的init

Swift中的訪問(wèn)控制(Access Control)

internal-- default, it means "usable by any object in my app or framework"
private - this means "only callable from within this object"
private(set) - this means "this property is readable outside this object but not settable"
fileprivate - accessible by any code in this source file

public (for frameworks only) this can be used by objects outside my framework
open (for frameworks only) public and objects outside my framework can subclass this
不做framework開(kāi)發(fā)的話不用在意后兩個(gè)

比較好的做法是將所有的東西都標(biāo)記為private赂蕴,當(dāng)我們發(fā)現(xiàn)這個(gè)東西需要外界調(diào)用時(shí)再取消private


Assertion 斷言

假定某個(gè)條件為真則繼續(xù)運(yùn)行,否則就crash并打印一條error信息舶胀。

這個(gè)東西在自己測(cè)試開(kāi)發(fā)時(shí)會(huì)有效概说,在產(chǎn)品中是無(wú)效的。

用于保護(hù)方法的實(shí)現(xiàn)嚣伐,可以測(cè)試一些錯(cuò)誤糖赔。

assert(一個(gè)bool,一個(gè)string錯(cuò)誤信息)


Extensions

Add vars(properties) and methods to a class/struct/enum, even if you don't have the source code for that class/struct/enum.

注意以下限制:

  • 你不能重寫(xiě)已有的method或property轩端。(你只能添加新的)
  • 添加的property不能有相關(guān)的storage(computed only)

這個(gè)extension和OC中的類(lèi)擴(kuò)展差別還是挺大的放典,OC里我沒(méi)記錯(cuò)的話可以重寫(xiě)方法覆蓋原來(lái)的方法,屬性也是可以進(jìn)行存儲(chǔ)的。

最好是給某個(gè)類(lèi)型添加相關(guān)的工具或功能奋构,不要添加和這個(gè)類(lèi)沒(méi)關(guān)系的功能壳影。


Optionals

先看enum
enum是class和struct之外的另一種數(shù)據(jù)結(jié)構(gòu)。
enum只能有離散的狀態(tài)(discrete states)

enum FastFoodMenuItem {
  case hamburger
  case fries
  case drink
  case cookie
}

enum是值類(lèi)型声怔,所以在傳遞時(shí)會(huì)被拷貝态贤。

enum和struct都是值類(lèi)型,傳遞時(shí)會(huì)進(jìn)行復(fù)制醋火,所以傳遞后你修改的是新的副本悠汽,而不是原來(lái)的那個(gè),而class是引用類(lèi)型芥驳,會(huì)傳遞自身柿冲,你修改一處,那么所有擁有這個(gè)class對(duì)象的兆旬,都會(huì)變化

每個(gè)case都可以有相關(guān)的數(shù)據(jù)(但不是非要有數(shù)據(jù))

enum FastFoodMenuItem {
  case hamburger(numberOfPatties: Int)
  case fries(size: FryOrderSize)
  case drink(String, ounces: Int)
  //the unnamed String is the brand, e.g. "coke"
  case cookie
}
//note that the drink case has 2 pieces of associated data(one of the "unnamed")
// in the example above, FryOrderSize would also probably be an enum
enum FryOrderSize {
  case large
  case small
}

使用enum

let menuItem: FastFoodMenuItem = FastFoodMenuItem.hamburger(patties: 2)
let otherItem: FastFoodMenuItem = FastFoodMenuItem.cookie

如果要使用類(lèi)型推斷

let menuItem = FastFoodMenuItem.hamburger(patties: 2)
let otherItem: FastFoodMenuItem = .cookie

//以上都是可以的
//但是不可以像這樣
let otherItem = .cookie

//這個(gè)不難理解吧假抄。。丽猬。宿饱。

也就是說(shuō),只能推斷一側(cè)脚祟。如果你什么都不給的話谬以,那如何推斷呢?

一般使用enum判斷狀態(tài)時(shí)由桌,使用switch
某個(gè)分支你不想做什么就用break
switch語(yǔ)句必須遍歷所有情況为黎,不能有剩余,如果你不關(guān)心某些狀態(tài)行您,記得使用default
swift中的switch默認(rèn)是不會(huì)fall through的铭乾,不會(huì)繼續(xù)執(zhí)行下一個(gè)case

enum是可以有method的,以及computed properties娃循,不可以有stored properties

enum FastFoodMenuItem {
  case hamburger(numberOfPatties: Int)
  case fries(size: FryOrderSize)
  case drink(String, ounces: Int)
  //the unnamed String is the brand, e.g. "coke"
  case cookie

  func isIncludedInSpecialOrder(number: Int) -> Bool {}
  var calories: Int { //calculate and return caloric value here }
}

enum自己的method中炕檩,可以對(duì)自己的狀態(tài)進(jìn)行判斷(switch self)。但不可以在property的get中進(jìn)行判斷捌斧。

enum FastFoodMenuItem {

  ···

  func isIncludedInSpecialOrder(number: Int) -> Bool {
    switch self {
      case .hamburger(let pattyCount): return pattyCount == number
      case .fries, . cookie: return true//fries and cookie in every special order
      case .drink(_, let ounces): return ounces == 16//16oz drink of any kind
    }
  }
  var calories: Int { //calculate and return caloric value here }
}

在enum的method中甚至可以對(duì)自己進(jìn)行修改(更改自己的類(lèi)型)

enum FastFoodMenuItem {

  ···

  mutating func switchToBeingACookie() {
    self = .cookie//此時(shí)將自身轉(zhuǎn)換為cookie了捧书,不管你原來(lái)是hamburger還是fries還是什么
  }
}

需要注意的是,mutating是必須要寫(xiě)的骤星,因?yàn)閑num是一個(gè)值類(lèi)型经瓷,copy on write。(struct中也需要寫(xiě)mutating


說(shuō)了這么多洞难,Optional其實(shí)就是個(gè)enum舆吮。
大概就是這樣:

enum Optional<T> {
//a generic type, like Array<Element> or Dictionary<Key, Value>
  case none
  case some(<T>)//the some case has associated data of type T
}

但是它很特殊,有許多特殊的語(yǔ)法。

Optional的特殊語(yǔ)法
Swift中重要的四種數(shù)據(jù)結(jié)構(gòu)
ARC
strong weak unowned
  • strong是默認(rèn)的色冀,一般我們不需要寫(xiě)出來(lái)潭袱。

  • weak:如果別人都不感興趣了,我也就不感興趣了锋恬,把我設(shè)置成nil就好屯换。
    那么既然weak是可以設(shè)置為nil的,我們很顯然可以知道只有optional的引用類(lèi)型才可能是weak与学。別的地方是用不到weak的彤悔。
    常見(jiàn)的兩個(gè)weak情景,一個(gè)就是outlet索守,另一個(gè)是delegate晕窑。別的地方真的很少用weak了。
    weak指針是不會(huì)將對(duì)象保留在heap中的卵佛。

  • unowned:別引用計(jì)數(shù)我杨赤。我指向某個(gè)地方,但是你別計(jì)數(shù)我截汪。我保證沒(méi)有引用計(jì)數(shù)時(shí)(heap中沒(méi)有這個(gè)對(duì)象時(shí)我絕對(duì)不會(huì)訪問(wèn)這里的疾牲,但是你一旦訪問(wèn)的話就會(huì)crash)這個(gè)真的幾乎不用,太危險(xiǎn)了衙解。
    一般用unowned來(lái)干嘛呢说敏?解決引用循環(huán)。
    closure經(jīng)常產(chǎn)生引用循環(huán)丢郊。

struct
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市医咨,隨后出現(xiàn)的幾起案子枫匾,更是在濱河造成了極大的恐慌,老刑警劉巖拟淮,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件干茉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡很泊,警方通過(guò)查閱死者的電腦和手機(jī)角虫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)委造,“玉大人戳鹅,你說(shuō)我怎么就攤上這事』枵祝” “怎么了枫虏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我隶债,道長(zhǎng)腾它,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任死讹,我火速辦了婚禮瞒滴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赞警。我一直安慰自己妓忍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布仅颇。 她就那樣靜靜地躺著单默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忘瓦。 梳的紋絲不亂的頭發(fā)上搁廓,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音耕皮,去河邊找鬼境蜕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凌停,可吹牛的內(nèi)容都是我干的粱年。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼罚拟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼台诗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起赐俗,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拉队,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后阻逮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粱快,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年叔扼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了事哭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓜富,死狀恐怖鳍咱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情与柑,我是刑警寧澤流炕,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布澎现,位于F島的核電站,受9級(jí)特大地震影響每辟,放射性物質(zhì)發(fā)生泄漏剑辫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一渠欺、第九天 我趴在偏房一處隱蔽的房頂上張望妹蔽。 院中可真熱鬧,春花似錦挠将、人聲如沸胳岂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乳丰。三九已至,卻和暖如春内贮,著一層夾襖步出監(jiān)牢的瞬間产园,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工夜郁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留什燕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓竞端,卻偏偏與公主長(zhǎng)得像屎即,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子事富,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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