Ch15. 型態轉換與延展.

Slides:



Advertisements
Similar presentations
1 公文写作技巧 2 公文的写作方法和技巧 商务公文写作的注意事项 商务公文范本 3 公文的写作方法与技巧 1 、 写作特点 2 、 写作要求 3 、 写作程序 4 、 写作内容 5 、 写作技巧.
Advertisements

JAVA 编 程 技 术 主编 贾振华 2010年1月.
第一單元 建立java 程式.
第一章 面向对象程序设计.
程設一.
第八章 类和对象.
1 Department of Computing.
再回首: Java关键字 数据类型:byte boolean char double float int long short ,
程設一.
Q1: 追蹤程式: 印出結果? 搶答 while (i<=n) { p=p*i; i=i+2; }
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
第十一章 結構.
程式設計 博碩文化出版發行.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
Visual C++ introduction
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
第四章 在 C# 中实现 OOP 概念.
JAVA 程式設計與資料結構 第七章 繼承與Interface.
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
Classes Lecturer: 曾學文.
Ch10 類別與物件-方法 Java程式設計(2).
第3章 继承和派生.
Java软件设计基础 5. 继承与多态.
C語言簡介 日期 : 2018/12/2.
程序设计期末复习 黎金宁
生物資訊程式語言應用 Part 3 Perl Language.
C++ 與 物件導向 程式設計概念簡介 魏天君 2018/12/3.
類別(class) 類別class與物件object.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
Java程序设计 第9章 继承和多态.
類別的繼承 Vehicle Car.
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
高级数据库系统作业答疑 ——面向对象
丙級電腦軟設-VB程式設計 資料來源:林文恭研究室 整理:張福生.
Java 程式設計 講師:FrankLin.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第一單元 建立java 程式.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
Ch17.泛型.
CH10. 屬性與方法.
CH05. 選擇敘述.
LINQ資料查詢技術.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Ch02.變數、常數以及資料型態.
字符串 (String) 字符串是 n (  0 ) 个字符的有限序列, 记作 S = “c1c2c3…cn” 其中,S 是串名字
C qsort.
Object-Oriented Programming in C++ 第二章 类和对象
Ch09. 類別、結構與列舉.
本节内容 Lua基本语法.
Ch16. 協定.
Ch18. 位元運算子與運算子函式.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
第 5 章 继承、多态和虚函数 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
Ch07. 函式.
Go 语言编程 —— 平台研发部 吴植民.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Ch01.從簡單的範例談起. Ch01.從簡單的範例談起 1.1 第一個程式 建立「Command Line Tool 」專案,名稱為 myFirst,Language選擇 Swift 修改 print(”Hello, world!”)為 print(”Learning Swift now!”)
對於成員(member)存取權的限制 成員的資料被毫無限制的存取,任誰都可以指定任意值給成員,Java語言為了防止這種現象的產生,規定:有一種成員的資料不能任由類別外部的任何人隨意存取。
Ch06. 聚集型態.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
第八章 面向对象编程 类 对象 继续 多态.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

Ch15. 型態轉換與延展

15.1 檢查型態 以範例來說明,以下有三個類別,分別為University、Teacher以及 Student。 15.1 檢查型態 以範例來說明,以下有三個類別,分別為University、Teacher以及 Student。 Teacher與Student類別皆繼承University類別。

範例程式part1 class University { var name: String init(name: String) { self.name = name } class Teacher: University { var status: String init(name: String, status: String) { self.status = status super.init(name: name) class Student: University { var grade: String init(name: String, grade: String) { self.grade = grade

範例程式part2 // type casting let campus = [ Teacher(name: "Nancy", status: "Professor"), Teacher(name: "Peter", status: "Associated Professor"), Student(name: "Carol", grade: "senior"), Teacher(name: "Mary", status: "Assist Professor"), Student(name: "John", grade: "sophomore") ] var teacherObj = 0 var studentObj = 0 for object in campus { if object is Teacher { teacherObj += 1 } else if object is Student { studentObj += 1 } print("Campus contains \(teacherObj) teachers and \(studentObj) students")

輸出結果 Campus contains 3 teachers and 2 students

15.2 向下轉型 某一類別型態的常數或變數,可能實際參考到子類別的實例。 15.2 向下轉型 某一類別型態的常數或變數,可能實際參考到子類別的實例。 若是,可以利用as型態轉型運算子(type cast operator)向下轉型 (downcast)為子類別型態。 因為向下轉型可能會失敗,所以型態轉型運算子有兩種版本: 選項格式as?,因為無法明確向下轉型知道是否成功,此格式永 遠會回傳一選項值或是nil 。 強制格式as,若你可以明確保證向下轉型會成功,則使用此格 式 。

範例程式 let campus = [ Teacher(name: "Nancy", status: "Professor"), Teacher(name: "Peter", status: "Associated Professor"), Student(name: "Carol", grade: "senior"), Teacher(name: "Mary", status: "Assist Professor"), Student(name: "John", grade: "sophomore") ] for object in campus { if let teacher = object as? Teacher { print("\(teacher.name) is \(teacher.status)") } else if let student = object as? Student { print("\(student.name) is a \(student.grade)") }

輸出結果 Nancy is Professor Peter is Associated Professor Carol is a senior Mary is Assist Professor John is a sophomore

15.3 對AnyObject和Any的型態轉換 Swift提供兩個特定型態的別名,用於非指定型態 :

15.3.1 AnyObject 想要定義任何類別型態的實例時,可利用AnyObject型態的完成。

範例程式 let campusObject: [AnyObject] = [ Teacher(name: "Nancy", status: "Professor"), Teacher(name: "peter", status: "Associated Professor"), Teacher(name: "Mary", status: "Assist Professor") ] for object in campusObject { let teacher = object as! Teacher print("\(teacher.name) is \(teacher.status)") }

輸出結果 Nancy is Professor peter is Associated Professor Mary is Assist Professor

15.3.2 Any 比AnyObject可定義更廣的型態。 除了可建立類別的型態外,也可以用來建立任何型態的變數或陣 列。

範例程式 // Any var data = [Any]() data.append("Hello Swift") data.append(Teacher(name: "Linda", status: "Professor")) for obj in data { print("\(obj)") }

輸出結果 Hello Swift 88.88 0.0 777 0 (10, 20) testAny.Teacher

15.4 延展 延展(extension)程顧名思義就是延伸原來沒有的功能。Swift的延 展與Objective C的類目(category) 類似。

15.4.1 屬性的延展 先從可計算的屬性之延展開始。我們以延展原先的型態Double, 此時多了三個可計算的的屬性,分別是mile、km以及m。此程式 以公里為基點,其它用以換算為公里。 //轉換為公里 extension Double { var mile: Double { return self * 1.6 } var km: Double { return self} var m: Double {return self / 1000} }

範例程式 // 轉換為公里 extension Double { var mile: Double { return self * 1.6 } var km: Double { return self} var m: Double {return self / 1000} } let oneHundredMile = 100.mile print("100 miles is \(oneHundredMile) kilometer") let oneHundredKm = 100.km print("100 miles is \(oneHundredKm) kilometer") let oneHundredMeter = 100.m print("100 meters is \(oneHundredMeter) kilometer")

輸出結果 100 miles is 160.0 kilometer 100 miles is 100.0 kilometer 100 meters is 0.1 kilometer

15.4.2 初始器與方法的延展 除了可延展屬性外,還可以延展初始器與方法。 15.4.2 初始器與方法的延展 除了可延展屬性外,還可以延展初始器與方法。 如有一結構Rectangle,原來有兩個屬性width與height。今加以延 展,增加了初始器init與兩個方法, 分別是getArea()與 setWidthAndHeight。

範例程式part1 // initializer and instance method struct Rectangle { var width = 0.0 var height = 0.0 } extension Rectangle { //initialization init(width2: Double, height2: Double) { width = width2 height = height2 //instant method func getArea() -> Double { return width * height //mutating instance method mutating func setWidthAndHeight(width: Double, height: Double) { self.width = width self.height = height

範例程式part2 var obj = Rectangle(width: 10, height: 20) print("width: \(obj.width), height: \(obj.height)") let objArea = obj.width * obj.height print("area: \(objArea)") obj.setWidthAndHeight(width: 11, height: 21) let objArea2 = obj.width * obj.height print("area: \(objArea2)")

輸出結果 width: 10.0, height: 20.0 area: 200.0 area: 231.0

15.4.3 索引的延展 也可以從Int延展出一索引的實例方法,只要呼叫subscript方法即 可,此方法有一參數,並回傳一Int。

範例程式 // subscript extension Int { subscript(index: Int) -> Int { var base = 1, i=1 while i <= index { base *= 10 i += 1 } return (self / base) % 10 print(123456789[0]) print(123456789[1]) print(123456789[2]) print(123456789[8]) print(123456789[9])

輸出結果 9 8 7 1 0

15.4.4 使用private 取代 fileprivate 在 Swift 3,若在類別或結構中定義 score 是私有的(private),必需 將其定義為 fileprivate ,才能給延展的類別或結構中的函式加以 擷取。 在 Swift 4 中可以直接將私有的資料直接定義為 private 。

範例程式 struct student { var name = "Joe" private var score = 90 } extension student { func display() { print("name: \(name), score: \(score)") var s1 = student() s1.display()

輸出結果 name: Joe, score: 90