扩展类型的时候,也可以添加新的构造函数。值类型与引用类型扩展有所区别。值类型包括了除类以外的其他类型,主要是枚举类型和结构体类型。
值类型扩展构造函数
扩展结构体类型中定义构造函数的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
struct Rectangle {
var width : Double
var height : Double
init(width : Double, height : Double) {
self.width = width
self.height = height
}
}
extension Rectangle {
//定义了Rectangle的扩展类型
init(length : Double) {
self.init(width : length, height :length)
}
}
var rect = Rectangle(width:
320.0
, height :
480.0
)
//调用两个参数的构造函数,这个构造函数是原始类型提供,Rectangle类型已经是扩展类型
print(
"长方形:\(rect.width)x \(rect.height)"
)
var square =Rectangle(length:
500.0
)
//调用一个参数的构造函数,这个构造函数是扩展类型提供的
print(
"正方形:\(square.width)x \(square.height)"
)
|
self.init是调用了原始类型的两个参数的构造函数。
引用类型扩展构造函数
扩展类中定义构造函数的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class
Person {
var name : String
var age : Int
func description() -> String {
return
"\(name) 年龄是: \(age)"
}
init (name : String, age : Int) {
self.name = name
self.age = age
}
}
extension Person {
//定义Person类的扩展类型
convenience init (name : String) {
//便利构造函数
self.init(name : name, age :
8
)
}
}
let p1 = Person(name :
"Mary"
)
//调用两个参数的构造函数,这个构造函数是原始类型提供,这时候的Person类型已经是扩展类型。
print(
"Person1 : \(p1.description())"
)
let p2 = Person(name :
"Tony"
, age :
28
)
//调用一个参数的构造函数创建Person实例,这个构造函数是扩展类型提供的。
print(
"Person2 : \(p2.description())"
)
|
代码self.init(name :name, age : 8)调用指定构造函数代理部分构造任务。
本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1748298,如需转载请自行联系原作者