讀書(shū)筆記-Swift-01Swift概述

開(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ì)模式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容