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