Ch17.泛型.

Slides:



Advertisements
Similar presentations
index 目次 ( 請按一下滑鼠,解答就會出現喔 !) 接續下頁解答 3-1 極限的概念.
Advertisements

“ 菸 ” 之非福 Part Ⅰ. 你的想法 ─ Q1 :你覺得他很有個性嗎? Q2 :吸菸會增加個人魅力嗎? Q3 :吸菸會讓人感覺成熟?
學會摘要 四年級 ( 內容擷取自劍潭國小陳錦蓮和詹珮怡老師的簡報 ). 2 分享綱要 1 1 什麼是摘要 2 3 如何教摘要 實例與實際操作.
我們可以如何應付氾濫 ? 2c 第三組. 目錄 防洪 (1) 防洪 (2) 湖北坪興建三峽主壩簡介 長江三峽水利樞紐工程 三峽工程的利益 (Part1) 三峽工程的利益 (Part2) 三峽工程的弊 (Part1) 三峽工程的弊 (Part2) 總結 組員名單 完.
第一單元 建立java 程式.
第九章日治時期的台灣(下).
AI人工智慧報告 黑白棋 班級:資工四乙 學號:498G0009 姓名:盧冠妤.
上課囉 職場甘苦談 小資男孩向錢衝 育碁數位科技 呂宗益/副理.
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
C++程序设计 王希 图书馆三楼办公室.
焦點14 低等無脊椎動物 (不具真體腔) 扁形動物,圓形動物 海綿動物,刺絲胞動物.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
C#程序设计 c# programming 泛型 C#程序设计课程组.
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
Chap 3 堆疊與佇列 Stack and Queue.
第8章 列舉器與集合 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
Ch13 集合與泛型 物件導向程式設計(2).
101北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
JAVA程序设计 第5章 深入理解JAVA语言----补充.
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
樹 2 Michael Tsai 2013/3/26.
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
資料結構 優點 缺點 1 陣列 (Array) 沒有額外變量 (例head, next,...) 運作/操作較簡單 更新資料時,若要保持順序,需要移動較大量資料 靜態結構Static (宣告時已決定了陣列元素多少,不能在程式執行期間增減元素) 2 隊列Queue (FIFO) 容易更新 加入enqueue:
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
$9 泛型基础.
Yummy Fruits.
CH10. 屬性與方法.
CH05. 選擇敘述.
Ch15. 型態轉換與延展.
挑戰C++程式語言 ──第8章 進一步談字元與字串
Lucene 算法介绍 IR-Lab 胡晓光.
物件導向程式設計 CH2.
如何使用Gene Ontology 網址:
程式的時間與空間 Time and Space in Programming
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
Ch02.變數、常數以及資料型態.
C qsort.
Ch09. 類別、結構與列舉.
資料結構簡介 綠園.
本节内容 Lua基本语法.
Ch16. 協定.
陣列與結構.
Ch18. 位元運算子與運算子函式.
Ch07. 函式.
北一女中 資訊選手培訓營 妳不可不了解的指標 Nan.
進階 WWW 程式設計 -- PHP Array 靜宜大學資訊管理學系 蔡奇偉副教授
Go 语言编程 —— 平台研发部 吴植民.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
Ch01.從簡單的範例談起. Ch01.從簡單的範例談起 1.1 第一個程式 建立「Command Line Tool 」專案,名稱為 myFirst,Language選擇 Swift 修改 print(”Hello, world!”)為 print(”Learning Swift now!”)
第6章 PHP基本語法介紹.
Programming & Language Telling the computer what to do
Ch06. 聚集型態.
Chapter 2 Entity-Relationship Model
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
變數與資料型態  綠園.
Array(陣列) Anny
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
資料!你家住哪裏? --談指標 綠園.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
InputStreamReader Console Scanner
Presentation transcript:

Ch17.泛型

17.1 泛型型態 兩數對調 佇列的運作 氣泡排序法

17.1.1 兩數對調 兩數對調先前已在函式那一章有討論過。程式如下: 17.1.1 兩數對調 兩數對調先前已在函式那一章有討論過。程式如下: 明明只是型態不同,但要處理不同型態的對調,卻要重新撰寫程 式,這效率太低。處理此問題與解決的方式可以使用所謂的泛型 型態的函式。 // swap two integer numbers func swapInts(a: inout Int, b: inout Int) { let temp = a a = b b = temp }

範例程式part1 // swap using generic function func swapData<T>(a: inout T, b: inout T) { let temp = a a = b b = temp } var oneInt = 100 var anotherInt = 200 print("Before swapped: ") print("oneInt = \(oneInt), anotherInt = \(anotherInt) ") swapData(a: &oneInt, b: &anotherInt) print("After swapped: ") var oneString = "Hello" var anotherString = "Swift" print("oneInt = \(oneString), anotherInt = \(anotherString) ") swapData(a: &oneString, b: &anotherString)

範例程式part2 var oneDouble = 123.456 var anotherDouble = 654.321 print("Before swapped: ") print("oneInt = \(oneDouble), anotherInt = \(anotherDouble) ") swapData(a: &oneDouble, b: &anotherDouble) print("After swapped: ")

輸出結果 Before swapped: oneInt = 100, anotherInt = 200 After swapped: oneString = Hello, anotherString = Swift oneString = Swift, anotherString = Hello oneInt = 123.456, anotherInt = 654.321 oneInt = 654.321, anotherInt = 123.456

撰寫成泛型型態函式的步驟是先將不一樣的地方畫出,然後以T表示之,並且在函 式名稱後加上 <T> 這樣就大功告成了。

17.1.2 佇列的運作 佇列 (queue) 和堆疊 (stack) 是資料結構的重要主題,在此僅以佇 列為例。 17.1.2 佇列的運作 佇列 (queue) 和堆疊 (stack) 是資料結構的重要主題,在此僅以佇 列為例。 佇列就是排隊,先來的先服務。

範例程式part1 // generic type struct Queue<T> { var items = [T]() mutating func insert(item: T) { items.append(item) } mutating func delete() -> T { return items.remove(at: 0) var queueOfInt = Queue<Int>() queueOfInt.insert(item: 100) queueOfInt.insert(item: 200) queueOfInt.insert(item: 300) queueOfInt.insert(item: 400) queueOfInt.insert(item: 500) print("The integer queue has following elements: ") for i in queueOfInt.items { print("\(i) ", terminator: "") print("")

範例程式part2 queueOfInt.delete() print("After delete 100, the queue has following elements: ") for i in queueOfInt.items { print("\(i) ", terminator: "") } print("") queueOfInt.insert(item: 600) print("After insert 600, the queue has following elements: ") print("\n")

輸出結果 The integer queue has following elements: 100 200 300 400 500 After delete 100, the queue has following elements: 200 300 400 500 After insert 600, the queue has following elements: 200 300 400 500 600

17.2 型態限制 有時在處理泛型時,需要一些條件加進來才能處理,此稱為型態 的限制 (type constraint) 。

17.2.1 找某一值位於陣列的何處 以下是一找尋某一字串在字串陣列的位置,其片段程式如 下: 同理也可以將上述的程式改為整數、浮點數陣列。 17.2.1 找某一值位於陣列的何處 以下是一找尋某一字串在字串陣列的位置,其片段程式如 下: 同理也可以將上述的程式改為整數、浮點數陣列。 func searchData(array: [String], valueToSearch: String) ->Int? { for (index, value) in array.enumerated() { if value == valueToSearch { return index } return nil

範例程式part1 func searchData<T: Equatable>(array: [T], valueToSearch : T) -> Int? { for (index, value) in array.enumerated() { if value == valueToSearch { return index } return nil let arrayofStrings = ["Apple", "Guava", "Banana", "Kiwi", "Orange"] let found = searchData(array: arrayofStrings, valueToSearch: "Kiwi") print("The index of Kiwi is \(found)") let found2 = searchData(array: arrayofStrings, valueToSearch: "Pineapple") print("The index of Pineapple is \(found2)") let arrayOfInt = [11, 22, 33, 44, 55] let found3 = searchData(array: arrayOfInt, valueToSearch: 55) print("\nThe index of 55 is \(found3)") let found4 = searchData(array: arrayOfInt, valueToSearch: 66) print("The index of 66 is \(found4)") let arrayOfDouble = [11.1, 22.2, 33.3, 44.4, 55.5] let found5 = searchData(array: arrayOfDouble, valueToSearch: 22.2)

範例程式part2 print("\nThe index of 22.2 is \(found5)") let found6 = searchData(array: arrayOfDouble, valueToSearch: 66.6) print("The index of 66.6 is \(found6)")

輸出結果 The index of Kiwi is Optional(3) The index of Pineapple is nil The index of 55 is Optional(4) The index of 66 is nil The index of 22.2 is Optional(1) The index of 66.6 is nil

17.2.2 氣泡排序 氣泡排序是兩兩相比較,若是由小由大,表示當前一個值比後一 值大時,則必須交換,否則不變動。

範例程式 //sorting integer numbers var arrOfInt = [10, 30, 5, 7, 2, 8, 18, 12] print("Before sorted: ") for i in arrOfInt { print("\(i) ", terminator: "") } func bubbleSort(arr: inout [Int]) { var flag: Bool for i in 0..<arr.count-1 { flag = false for j in 0..<arr.count-i-1 { if arr[j] > arr[j+1] { flag = true let temp = arr[j] arr[j] = arr[j+1] arr[j+1] = temp if flag == false { break bubbleSort(arr: &arrOfInt) print("\n\nAfter sorted: ") for j in arrOfInt { print("\(j) ", terminator: "") print("")

輸出結果 Before sorted: 10 30 5 7 2 8 18 12 After sorted: 2 5 7 8 10 12 18 30

17.3 關連型態 當定義協定時,有時宣告一或多個關連型態當做協定的定義很有 用。 17.3 關連型態 當定義協定時,有時宣告一或多個關連型態當做協定的定義很有 用。 一般關連型態以associatedtype關鍵字表示(Swift 3之前是 typealias)。

範例程式part1 protocol ExtraInformation { associatedtype ItemType var count: Int {get} subscript(i: Int) -> ItemType {get} } struct QueueType<T>: ExtraInformation { var items = [T]() mutating func insert(item: T) { items.append(item) mutating func delete() { items.remove(at: 0) //comformance to the ExtraInformation Protocol typealias ItemType = T var count: Int { return items.count subscript(i: Int) -> T { return items[i]

範例程式part2 var queueOfData = QueueType<Int>() queueOfData.insert(item: 100) queueOfData.insert(item: 200) queueOfData.insert(item: 300) queueOfData.insert(item: 400) queueOfData.insert(item: 500) print("陣列中有\(queueOfData.count)個元素") for i in queueOfData.items { print("\(i) ", terminator: "") } print("\n") queueOfData.delete() print("刪除100後,陣列中有\(queueOfData.count)個元素") queueOfData.insert(item: 600) print("加入600後,陣列中有\(queueOfData.count)個元素") print("queueOfData[2] = \(queueOfData[2])") print("")

輸出結果 陣列中有5個元素 100 200 300 400 500 刪除100後,陣列中有4個元素 200 300 400 500 加入600後,陣列中有5個元素 200 300 400 500 600 queueOfData[2] = 400