這篇文章 主要是比較兩種語言的初始化
swift 中的初始化
Swift 的初始化和 Objective-C 有一個很大的不同,Objective-C 默認會給每個屬性賦一個空值,如 nil 或者 0排宰,但 Swift 的初始化更加嚴格挽唉,需要開發(fā)者自己顯示指定類成員的初始值捞慌,否則編譯會報錯
1.結(jié)構(gòu)體初始化
如果結(jié)構(gòu)體沒有實現(xiàn)任何初始化函數(shù)藐翎,Swift 默認給生成一個包含所有成員變量的初始化構(gòu)造器
struct TestStruct {
let num: Int
let name: String
let gender: String
}
// 如果這個結(jié)構(gòu)體 初始化 直接寫
let test = TestStruct() // 會報錯
//第一種改進方法 給初值
// 第二種改進方法
let test = TestStruct(num: 0, name: "bob", gender: "man")
類的初始化
和結(jié)構(gòu)體不同,類必須聲明初始化構(gòu)造器
class LaunchSite {
let name: String
let coordinates: (String, String)
init(name: String, coordinates: (String, String)) {
self.name = name
self.coordinates = coordinates
}
}
// 如果去掉 init函數(shù) 將會報錯
指定構(gòu)造器
指定構(gòu)造器是對于 沒有默認值的非可選參數(shù)的初始化
class PuppyDog {
var name: String
init(name: String) {
self.name = name
}
}
遍歷構(gòu)造器
便利構(gòu)造器通常要調(diào)用類自身的便利構(gòu)造器或者指定構(gòu)造器橘忱,不管是哪種涯竟,最終都要調(diào)用指定構(gòu)造器.
//便利構(gòu)造器是在init前加一個關鍵子convenience赡鲜,它為一些屬性提供默認值:
class PuppyDog {
var name: String
convenience init(name: String) {
self.init(name: name)
}
}
子類的初始化
子類自身屬性的初始化需要在調(diào)用父類的初始化構(gòu)造器前完成,如下代碼
父類屬性的初始化庐船,需要在調(diào)用父類構(gòu)造器之后
Dart 里面的初始化
1 dart 里面 子類不能繼承父類的構(gòu)造函數(shù)
2 dart 如果你沒有聲明構(gòu)造函數(shù)银酬,默認有構(gòu)造函數(shù),默認構(gòu)造函數(shù)沒有參數(shù)筐钟,調(diào)用父類的無參構(gòu)造函數(shù)揩瞪。子類不能繼承父類的構(gòu)造函數(shù)(swift 結(jié)構(gòu)體里面有默認構(gòu)造函數(shù),類里沒有必須手寫),dart使用默認構(gòu)造函數(shù) ,聲明的屬性都會被賦初值nil 或者 0.
3.構(gòu)造函數(shù)就是一個與類同名的函數(shù),關鍵字 this 是指當前的篓冲,只有在命名沖突時有效李破,否則dart會忽略處理
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
// 另外一種寫法
// Point(this.x, this.y); 實例對象沒一個 參數(shù)對應一個屬性 做初始化
}
命名構(gòu)造函數(shù)(swift 中類似于指定構(gòu)造器 )
使用命名構(gòu)造函數(shù)讓類有多個構(gòu)造函數(shù)
class Point {
int x;
int y;
// Point(int x, int y) {
// this.x = x;
// this.y = y;
// }
// 另外一種寫法
Point(this.x, this.y);
// 命名構(gòu)造函數(shù)
Point.fromJson(Map json) {
x = json['x'];
y = json['y'];
}
}
子類的構(gòu)造函數(shù)
子類構(gòu)造函數(shù)調(diào)用父類的默認構(gòu)造函數(shù),如果父類重寫了構(gòu)造函數(shù)壹将,必須手動調(diào)用父類的構(gòu)造函數(shù)嗤攻,在 : 號后面指定父類的構(gòu)造函數(shù)
class Person {
Person.fromJson(Map data) {
print("in Person");
}
}
// 在:之后必須調(diào)用父類的構(gòu)造函數(shù)
class Employee extends Person {
Employee.fromJson(Map data): super.fromJson(data) {
print("in Employye");
}
}
枚舉
swift
enum TestError: Error{
case one
case two
}
dart
枚舉類型是一種特殊的類,用于表示一個固定數(shù)量的常量值瞭恰,不能實例化屯曹,使用enum關鍵字聲明一個枚舉類型(swift 一樣)
void main(){
print(Color.red.index); // 0
print(Color.green.index); // 1
print(Color.blue.index); // 2
// print(TestError.one.hashValue) 這是swift 打下標 如果 沒有聲明 默認從0開始
// 獲得枚舉值的列表(swift 里面不能這樣寫)
List<Color> colore = Color.values;
print(colore[2]); // Color.blue
// 在switch語句中使用枚舉
Color aColor = Color.blue;
switch(aColor) {
case Color.red:
print("Red as Roses!");
break;
case Color.green:
print("Green as grass!");
break;
default:
print(aColor);
}
}
enum Color {
red,
green,
blue
}
類擴展
swfit 里面的類擴展
extension TestNameCell {
// 只能聲明計算屬性 聲明不了儲存屬性
var i : Int {
return
}
// 不能被重寫 除非指定消息類型 比如 dynamic
func getName() {
print("name")
}
}
dart擴展類
class Musician extends Performer with Mnsical {
// ...
}
class Maestro extends Person with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
//需要實現(xiàn) 擴展類
// 擴展類 相當于一個抽象類 不能實例化(類似于 swift中的protocol)
abstract class Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}
靜態(tài)方法
swift里面用Static 修飾 也可以說是類方法
static 可以修飾 struct, enum, class 里面的類方法
class 只是在class 里面修飾 計算屬性
static 可以在class 里面修飾計算屬性和儲存屬性
不過static 修飾的 方法 和屬性沒辦法被重寫
dart
// 基本上和swift里面是一樣的
void main(){
var a = new Point(2, 2);
var b = new Point(4, 4);
var distance = Point.distanceBetween(a, b);
print(distance); // 2.8284271247461903
}
class Point {
int x;
int y;
Point(this.x, this.y);
static int distanceBetween(Point a, Point b) {
var dx = a.x - b.x;
var dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
}