iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
1
Mobile Development

30 天從 Swift 學會 Objective-C系列 第 1

[01] 30 天從 Swift 學會 Objective-C: 關於這個系列與介紹

這是這個系列的第一篇文章,將簡短介紹系列文,與 Objective-C 的簡介。


Photo by @dtopkin1 on Unsplash

系列開始之前

你好,謝謝你想閱讀這個系列文章,這個系列文章我個人認定是中等難度的,建議是具有基本的物件導向程式設計能力或是具有 Swift 語言基礎的人閱讀。文末有相關的簡單測試,可以快速了解目前的自己適不適合了解這個主題,如果你回答不出來,別擔心,可以留言試著解答,說不定你其實已經知道了。

為什麼要選這個主題

2019 年以前,由於 Swift 尚未達成 ABI 穩定,所以有許多公司在專案上的語言選擇上,會因為 Swift System 的 API 不穩定,為了避免產品在不同 iOS 版本之間有巨大的適應落差,因此會相對選擇歷史相對悠久的 Objective-C。今年( 2020 年) 是 Swift 迎來 ABI 穩定的第二年,市場上漸漸認同了 Swift 語言的價值,願意開始以 Swift 作為主要開發語言。根據 Stack Overflow 在 2020 年的 [ Developer Survey ] 中: Swift / Objective-C 的喜愛比率分別有 59.5 / 23.4%,恐懼比率則分別是40.5 / 76.6% 真實反應了全世界的開發者對於 這兩個語言的偏好。但是由於 Objective-C 學習資源的日漸短少,相關人才也越來越稀缺,Objective-C 的平均薪水足足高於 Swift 10 個百分點(世界範圍)。目前有不少資深的開發者強調想把 Objective-C 的舊有程式改寫成 Swift,這樣的想法成為了這次的鐵人賽選擇這個主題的原因:

透過在 Swift 開發經驗,了解 Objective-C 的語言文法、中心思想及適應 Swift 的方法。

我希望能在 30 天內使讀者了解 Objective-C 的閱讀、理解、改寫,並能夠進一步的具備能為現有 Objective-C 程式碼提供 Swift friendly 的能力。

最小開發環境

  • Objective-C 2.0
  • OS
  • 編輯器沒有限制,推薦 Vim、Xcode

關於我,我是游諭

我是游諭,一位 iOS 的開發者,具備 C 語言、Swift 語言、bash 語言、 Makefile 語言能力,2018 年完成 School 42 Fremont Piscine C,獨立 app 開發經驗,對於物件導向程式設計與設計模式略有涉略,喜歡 Functional 程式設計。

系列文章大綱

文章共區分 3 個大章節:

  1. 介紹 Objective-C 與 C 的關係,說明為什麼學 Objective-C 要一點簡單的 C。
  2. 說明 Objective-C 的物件導向部分,並帶入從Swift來的觀念。
  3. 運用 Apple 提供的 Objective-C syntax,將Objective-C 提供給 Swift 使用。

學習資源

以下是我目前找到不錯的學習資源

Objective-C 介紹

Objective-C 的名字中 Objective 很直接的告訴我們,她的本質還是 C 語言,也因此我們可以理解以下 Objective-C 的開發背景。

C 語言在 1970 年代初期,由 Dennis Ritchie 與 Ken Thompson 在美國 Nokia Bell Labs 開發出來。當初 C 語言面世之前,程式主要以組合語言作為編寫的方式,需要針對執行機器編寫,造成程式必須在指定的電腦上執行的問題。而 C 語言透過定義型別、可移植編譯器,大大的解除了指定電腦的限制,也因此有了高階語言的區分。隨著 C 語言的便利,越來越多公司開始使用 C 語言作為開發主力,而在 1989 年美國國家標準協會將 C 語言標準化,奠定了 C 語言在 20 世紀的樣貌。

而物件導向是沒有在 C 語言出現的。物件導向程式設計早在 1960 年代出現,當時的程式設計面臨軟體維護的危機,為了解決這個在軟硬體逐漸複雜的環境變化,1970 年代便出現了 Smalltalk 語言,奠定了物件導向語言的基礎。

當我們提到物件導向的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。 wiki - 物件導向程式設計

Objective-C 是由 Tom Love 與 Brad Cox 與 1980 年代發表,當時 並不屬於 Apple 公司而是 Productivity Products International。關於當初 Love 與 Cox 設計 Objective-C 的理念,建議可以閱讀由 brad Cox 的書籍 《Object-Oriented Programming, An Evolutionary Approach 》


Object-Oriented Programming, An Evolutionary Approach 封面

1988 年 Steve Jobs 成立 NeXT 公司並買下 Objective-C 的授權,並研發 NeXTSTEP 作業系統作為產品,後續 Apple 收購 NeXT 並使 NeXTSTEP 成為 OS X 的基礎,後來成為 現在所知道的 Cocoa。

下一篇文章介紹 Objective-C 與 C 語言的關係,說明 C 語言在 Objective-C 的地位。

簡單測驗

  1. 請問程式設計中,"宣告" 與 “定義” 有什麼不同?
  2. 請問 heap 與 stack 之外,還有什麼?它們是什麼?
  3. 物件導向程式設計是什麼?為什麼要用物件導向程式設計?
  4. 請問物件導向設計中,每個物件中的函式是不是獨一無二的?

歡迎留言你的答案,或是與已經有留言的網友互動 ?。

references:


下一篇
[02] 30 天從 Swift 學會 Objective-C:Objective-C 的編譯與 Hello world
系列文
30 天從 Swift 學會 Objective-C30
0
Alvin
iT邦新手 5 級 ‧ 2020-09-23 11:12:16

你好,我是Alvin

  1. 宣告 declaration 劃分連續位址的記憶體; 定義 definiton 將值寫入劃分的位址。
  2. heap 動態記憶體配置 ; stack 是靜態的記憶體配置。他們是記憶體組織出資料的方式,主要差異在heap是組織funtion用的,而stack是變數。
  3. 在OOP誕生之前,在軟硬體環境逐漸複雜的情況下,軟體維護困難。因此出現了重視複用性的OOP。
  4. 是啊。
看更多先前的回應...收起先前的回應...
ytyubox iT邦新手 5 級 ‧ 2020-09-23 12:43:41 檢舉

感謝回答,我針對你的答案我覺得沒有回答問題的部分

  1. 請問程式設計中,"宣告" 與 “定義” 有什麼不同?
    請回答出兩者不同的地方是什麼。
  2. 請問 heap 與 stack 之外,還有什麼?它們是什麼?
    請回答兩者之外還有什麼
  3. 物件導向程式設計是什麼?為什麼要用物件導向程式設計?
    這部分沒有要補充的
  4. 請問物件導向設計中,每個物件中的函式是不是獨一無二的?
    這部分沒有要補充的
ytyubox iT邦新手 5 級 ‧ 2020-09-23 12:43:42 檢舉

重覆留言請忽略

Alvin iT邦新手 5 級 ‧ 2020-09-29 11:33:31 檢舉
  1. 宣告與定義,請問上面是有哪個地方回答得不好呢?

------頂層-------
system:命令列參數與環境變數
heap:動態配置變數
stack:區域變數
bss:未初始化靜態變數
data:初始化靜態變數
text:程式碼,這裡存放的是可執行的 CPU 指令
------底層-------
3.物件導向的三大特性
封裝,繼承,多型
封裝:封裝使物件的設計者與物件的使用者分開,使用者只要知道物件可以做什麼就可以了,不需要知道具體是怎麼實現的。
繼承:建立一個新的派生類,從一個或多個先前定義的類中繼承資料和函式,可以重新定義或加進新資料和函式,從而建立了類的層次或等級。
多型:同一操作作用與不同類的例項,將產生不同的執行結果,即不同類的物件收到相同的訊息時,將得到不同的結果。
4. 每個物件中的函式是獨一無二的

ytyubox iT邦新手 5 級 ‧ 2020-09-30 10:11:15 檢舉
  1. 目前我看到不錯的回答是來自於 GeeksForGeeks 的解釋,關鍵字是 Difference between Definition and Declaration
  2. 是的,程式在現在的電腦架構下是以這個模型,參考 Data segment wiki
  3. 減少重複的程式碼是 OOP 的重點之一
  4. 每個物件中的函式(Method),我覺得並不是獨一無二的,如果你覺得我是錯的你是對的,請提供解釋

4函式是獨一無二的
如果你函式有相同的 那妳何不刪掉重複的函式?

ytyubox iT邦新手 5 級 ‧ 2020-10-20 16:35:59 檢舉

tony781124
在物件生成後,函式要如何被刪除了?
照我的推測,你說的是型別的函式,在程式設計階段(編譯前)將重複的函式從原始碼移除。
而我的問題以 Swift 來示範是這樣的

class ObjectType {
    func aFunction() {}
}

let objectNo1 = ObjectType()
let objectNo2 = ObjectType()
objectNo1.aFunction !== objectNo2.aFunction  // 這行無法編譯的

請問 objectNo1.aFunction 與 objectNo2.aFunction 是不是同一個 referance

0
ytyubox
iT邦新手 5 級 ‧ 2020-10-20 16:39:02

關於第 4 題的提醒:
物件是由型別生成的,每個物件可以用自己的 reference,而物件的型別是獨一無二的。

Swift 示範問題

class ObjectType {
    func aFunction() {}
}

let objectNo1 = ObjectType()
let objectNo2 = ObjectType()
objectNo1.aFunction !== objectNo2.aFunction  // 這行無法編譯的

請問 objectNo1.aFunction 與 objectNo2.aFunction 是不是同一個 referance

來源同一個referance,但實作之後是不同個體無法相等
不太懂你不是獨一無二的點在哪?就像雙胞胎來自同一對染色體,但還是不同的個體,所以人是獨一無二的

ytyubox iT邦新手 5 級 ‧ 2020-10-22 10:14:38 檢舉

在 Swift 中,objectNo1.aFunction()語法可以等價於 ObjectType.AFunction(objectNo1)
在 Python 中,編寫物件的function時,第一個參數是 self。
在 Python 3.9 的文件中,9.3.4 章節有提到

In our example, the call x.f() is exactly equivalent to MyClass.f(x). 

我得到的想法是參考這一段,對我來說很合理,物件的 Function 是共用的而非每個物件擁有各自的Function,你覺得呢?

0
MarkFly~
iT邦新手 5 級 ‧ 2020-12-10 10:22:39

恭喜獲獎/images/emoticon/emoticon12.gif

ytyubox iT邦新手 5 級 ‧ 2020-12-10 11:18:24 檢舉

感謝~/images/emoticon/emoticon34.gif
還記得開賽期間沒有靈感都會去你那邊繞繞 XD

XDD

我要留言

立即登入留言