開(kāi)始
- 典型的語(yǔ)句如下:
print("hello")
print("world")
- 一行就是一個(gè)語(yǔ)句,換行是有意義的。
- 也可以一行寫(xiě)多個(gè)語(yǔ)句,不過(guò)要用分號(hào)分開(kāi)。
- 也可以在每行后面寫(xiě)個(gè)分號(hào),不過(guò)沒(méi)什么用,可以兼容C/OC的語(yǔ)言習(xí)慣
- 一個(gè)語(yǔ)句可以拆分成多行,用于防止一行太長(zhǎng)。但是要在一個(gè)合理的地方斷。比如括號(hào)的地方就是個(gè)好地方。
print(
"world")
- 雙反斜杠(//)表示注釋一行。和C、OC一樣。
- (/* ... */) 可以注釋一段
- 大括號(hào)一般會(huì)換行對(duì)齊。但是也有寫(xiě)在一行的。語(yǔ)法上都可以。方便的話也可以寫(xiě)在一行。
- swift是編譯型語(yǔ)言。必須先編譯成機(jī)器語(yǔ)言。
- swift編譯器非常嚴(yán)格。編譯器給的警告也應(yīng)該重視。
- swift給出的錯(cuò)誤和警告,有的很重名,有的很垃圾(誤導(dǎo))。有時(shí)候給的錯(cuò)誤提示不在真正發(fā)生錯(cuò)誤的地方。所以有個(gè)辦法就是把語(yǔ)句拆分成多行。這樣更容易定位哪行出錯(cuò)了。
所有的東西都是對(duì)象?
- swift中任何東西都是對(duì)象。粗略的規(guī)定,一個(gè)對(duì)象就是你可以對(duì)它發(fā)消息的東西。消息,就是一種必要的指令。這樣理解的話,任何東西都是對(duì)象。
- swift中,發(fā)消息的語(yǔ)法是“點(diǎn)”(dot-notation)
fido.bark()
rover.sit()
- 任何東西的意思就是說(shuō),語(yǔ)言原始的實(shí)體都能被發(fā)送消息。1看上去是基本數(shù)據(jù)類(lèi)型,也是個(gè)對(duì)象,可以發(fā)消息,下面的是合法的。
let s = 1.description
- 在swift中,最終檢測(cè)一個(gè)東西是不是對(duì)象的方法,就是看你是否能改變它。對(duì)象類(lèi)型可以被擴(kuò)展,意味著你可以對(duì)這個(gè)類(lèi)型定義自己的方法。swift中的類(lèi)型是可以擴(kuò)展的。
- 所以swift中沒(méi)有標(biāo)量。所有的類(lèi)型都是對(duì)象類(lèi)型。
三種常用的對(duì)象類(lèi)型
- swift有三種常用的對(duì)象類(lèi)型。classes,cstucts,enums
- 三種類(lèi)型的相似遠(yuǎn)大于不同
- struct,enum在oc和swift中是不同的。
變量
- 變量就是對(duì)象的名字。你可以想象成放對(duì)象的鞋盒子。對(duì)象可能被更改,被替換,但是變量名是不會(huì)變的。
- 變量需要先被聲明。let 申明常量。var聲明變量。聲明常常伴隨著初始化。
- 雖然說(shuō)var顯得靈活,但是知道不可改的時(shí)候,最好用let。首先能提高效率。
- 變量有類(lèi)型,類(lèi)型在聲明的時(shí)候確定,不可修改。
- 變量有生命周期。
- 變量的類(lèi)型約定大寫(xiě)字母開(kāi)頭。變量用小寫(xiě)字母開(kāi)頭。
函數(shù)
- 可執(zhí)行語(yǔ)句不是在任何地方都可以執(zhí)行的。要在函數(shù)體里執(zhí)行。函數(shù)就是一堆可執(zhí)行語(yǔ)句。函數(shù)的調(diào)用又是一個(gè)執(zhí)行語(yǔ)句,這樣又必須在某個(gè)地方調(diào)用。不用擔(dān)心最開(kāi)始的函數(shù)是誰(shuí)在調(diào)用,你在寫(xiě)iOS的APP,系統(tǒng)就會(huì)有地方調(diào)用。
- 函數(shù)有名字,在定義時(shí)確定。
- swift有特別的規(guī)則,有個(gè)main.swift的文件,可以在最頂層執(zhí)行。不在任何函數(shù)體里??梢杂眠@個(gè)main文件,通常沒(méi)必要。
swift文件結(jié)構(gòu)
- swift中,文件是一個(gè)完整意義的單位。只有特定的東西才能在文件中。
- 模塊導(dǎo)入語(yǔ)句
- 變量聲明
- 函數(shù)聲明
- 對(duì)象類(lèi)型聲明
- 模塊是更上一層的單元。模塊可以包含很多文件,他們可以互相調(diào)用。但是如果不導(dǎo)入的話,是不能互相看見(jiàn)的。
- 文件層級(jí)的變量聲明是全局變量。在文件級(jí)別的函數(shù)聲明是全局函數(shù)。
- 文件級(jí)別里不能直接放可執(zhí)行代碼。
- 可執(zhí)行代碼也不能放在類(lèi)聲明的大括號(hào)內(nèi)。這是類(lèi)聲明的頂層。類(lèi)聲明可以包含函數(shù)聲明。函數(shù)聲明可包含可執(zhí)行代碼。
作用域和生命周期
- 作用域是說(shuō)這個(gè)東西可以被別人看到。嵌套在別的東西里面的東西,也是嵌套繼承作用域。可以看到自己的同級(jí)別和上一級(jí)別的東西。
- 模塊范圍是個(gè)作用域。文件范圍是一個(gè)作用域。大括號(hào)是個(gè)作用域。
- 作用域是共享信息的重要方式。
- 東西都有生命周期。和作用域完全一致。聲明周期在作用域內(nèi)。
- 變量聲明,函數(shù)聲明,函數(shù)對(duì)象聲明可以在任何大括號(hào)內(nèi)。
對(duì)象成員
- 在對(duì)象類(lèi)型中,(class,struct,enum)在頂層定義的東西有特殊的名字。大部分因?yàn)闅v史原因。變量稱之為屬性;函數(shù)稱之為方法。
- 所有頂層中的,稱之為對(duì)象的成員。成員都有特殊的簽名。
命名空間
- 命名空間內(nèi)部的東西不能被命名空間外部的東西直接訪問(wèn)。除非明確指出命名空間的名字。這樣可以讓同樣的名字在不同的地方使用,而不會(huì)有沖突。
- 命名空間本身不提供安全和隱私,只是提供方便。
- 使用(.)點(diǎn)的方式來(lái)引用命名空間,其實(shí)和發(fā)消息是一個(gè)機(jī)制。發(fā)消息允許你看一個(gè)其他你不能看到的作用域。
模塊
- 頂級(jí)的命名空間是模塊。默認(rèn)情況下,你的app是個(gè)模塊因此也是個(gè)命名空間。
- frameworks也是模塊,因此也是命名空間。
- 引入模塊的時(shí)候,所有模塊中的頂級(jí)聲明都可以看到。
- 不要在自己的模塊中定義和系統(tǒng)沖突的類(lèi)。干不過(guò)他。
- swift自己也是在模塊中定義的。稱之為swift模塊。通常隱含的導(dǎo)入了swift模塊。像print這樣的函數(shù)就是在這個(gè)模塊中。
- swift模塊頂級(jí)中包含了全局函數(shù),操作符比如+,內(nèi)置類(lèi)型比如Int,內(nèi)置結(jié)構(gòu)比如String。
實(shí)例
- 對(duì)象類(lèi)型有一個(gè)重要特性,可以被實(shí)例化。類(lèi)定義只是說(shuō)這類(lèi)是什么樣子,要有具體的對(duì)象,要造一個(gè)。
- 創(chuàng)建實(shí)例就類(lèi)型加括號(hào)即可。
- 方法分為實(shí)例方法和類(lèi)方法。屬性也有類(lèi)屬性和實(shí)例屬性。
為什么有實(shí)例
- 對(duì)象類(lèi)型本身是個(gè)對(duì)象??梢詫?duì)他發(fā)消息。
- 實(shí)例是類(lèi)描述的反映,也是存儲(chǔ)的空間。
- 實(shí)例不僅僅關(guān)乎屬性的值,也關(guān)乎屬性的生命周期。
- 實(shí)例是數(shù)據(jù)和代碼的集合。代碼是從類(lèi)的定義中來(lái)。數(shù)據(jù)是單獨(dú)的。
self
- 實(shí)例是一個(gè)對(duì)象,是消息的接收者。因此需要有個(gè)辦法對(duì)自己發(fā)消息。于是就有了self。
- self就代表本身這個(gè)對(duì)象??梢允÷詫?xiě)self。但是為了可讀性,一般不會(huì)省略。而且有的時(shí)候你必須寫(xiě)self。
隱私
命名空間不是訪問(wèn)內(nèi)部名字無(wú)敵的限制。但有些時(shí)候我們需要做些限制。
好的面向?qū)ο蟮脑O(shè)計(jì)需要有隱私設(shè)計(jì)。需要有辦法讓別的類(lèi)無(wú)法訪問(wèn)無(wú)法看見(jiàn)不支持被看見(jiàn)的類(lèi)的方法和屬性。
聲明為private的就可以。
-
一些保留字,private,class等,不能簡(jiǎn)單的作為變量的命名。要強(qiáng)制的話,需要加反點(diǎn)引號(hào)引起來(lái)。
class `func` { func `if`(){ let `class` = 1 } } 對(duì)象的屬性和方法默認(rèn)都是公有的。要搞成私有,用private
設(shè)計(jì)
- 面向?qū)ο蟪绦蛟O(shè)計(jì)是一門(mén)藝術(shù)
- 實(shí)際的開(kāi)發(fā)過(guò)程中,很多類(lèi)的設(shè)計(jì)都是Apple的。你不用去設(shè)計(jì),只需要學(xué)習(xí)怎么用。
- 面向?qū)ο蟮脑O(shè)計(jì)必須建立在靠譜的自然對(duì)象基礎(chǔ)上。然后是封裝合適的方法和數(shù)據(jù)。運(yùn)行的時(shí)候?qū)嵗?,有合適的生命周期,恰當(dāng)?shù)谋┞丁?/li>
對(duì)象類(lèi)型和API
- 程序常常有很少的全局函數(shù)和變量等。大部分是對(duì)象類(lèi)型的定義,類(lèi)定義之類(lèi)的。這樣更好的組織你的代碼。
- 小結(jié)下對(duì)象:
- 封裝功能;
- 維護(hù)數(shù)據(jù)
- 類(lèi)可以做什么,用API封裝。
實(shí)例創(chuàng)建,范圍和生命周期
- swift中運(yùn)行的通常是實(shí)例。要做事情先要對(duì)類(lèi)進(jìn)行實(shí)例化。默認(rèn)情況下是沒(méi)有實(shí)例的。需要自己造。造完之后放到一個(gè)變量中,生命周期和作用域都和這個(gè)變量一致。
- 實(shí)際的開(kāi)發(fā)過(guò)程中,app有一些框架,啟動(dòng)的時(shí)候就有一些實(shí)例。
小結(jié)和結(jié)論
- 有類(lèi),有實(shí)例。
- 對(duì)象是組織代碼的工具。
- 有些經(jīng)典的書(shū)可以繼續(xù)深入學(xué)習(xí)面向?qū)ο?。重?gòu);設(shè)計(jì)模式。