您的位置:首页 > 移动开发 > Swift

swift类型扩展

2016-01-22 09:39 579 查看
/**

1.扩展语法

2.计算型属性

3.构造器

4.方法

5.下标

6.嵌套类型

扩展就是向一个已有的类、结构体或枚举类型添加新功能。包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。扩展和OC中的分类(category)类似。不过与OC不同的是,swift的扩展没有名字。

如果定义一个扩展向已有类型添加新功能,那么这个心功能对该类型的所有已有实例中都是可用的,即使他们是在换个扩展的前面定义的

*/

//扩展语法

/**

声明一个扩展使用关键字extension

extension SomeType {

// 加到SomeType的新功能写到这

}

一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议。当这种情况发生时,接口的名字应该完全按照类或结构体的名字的方式进行书写

extension SomeType: SomeProtocol, AnotherProctocol {

// 协议实现写到这

}

按照这种方式添加的协议遵循者被称之为在扩中添加协议遵循者

*/

//计算型属性

/**

扩展可以向已有类型添加计算型实例属性和计算型类型属性

*/

extension Double {

var km: Double{

return self *
1000.0;

}

var m: Double {

return self;

}

var cm: Double {

return self /
100.0;

}

var mm: Double {

return self /
1000.0;

}

var ft: Double {

return self /
3.28084;

}

}

let oneInch = 25.4.mm;

print("One inch is
\(oneInch) meters");

let threeFeet = 3.ft;

print("Three feet is
\(threeFeet) meters");

let aMarathon = 42.km +
195.m;

print("a marathon is
\(aMarathon) meters long");

/**

扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器

*/

//构造器

/**

扩展可以向已有类型添加新的构造器。这可以让你扩展其它类型,将自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项

如果使用扩展向一个值类型添加一个构造器,该构造器向所有的存储属性提供默认值,而且没有定义任何定制构造器,那么对于来自你的扩展构造器中的值类型,你可以调用默认构造器的成员级构造器,正如在值类型的构造器授权中描述的,如果你已经把构造器写成值类型原始实现的一部分,上述规则不再使用

*/

struct Size {

var width = 0.0, height =
0.0;

}

struct Point {

var x = 0.0, y =
0.0;

}

struct Rect {

var origin = Point();

var size = Size();

}

let defaultRect =
Rect();

//let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0));

extension Rect {

init(center: Point, size:
Size) {

let originX = center.x - size.width /
2;

let originY = center.y - size.height /
2;

self.init(origin:
Point(x: originX, y: originY), size: size);

}

}

let centerRect = Rect(center:
Point(x: 4.0, y:
4.0), size: Size(width:
3.0, height: 3.0));

print("X:\(centerRect.origin.x),Y:\(centerRect.origin.y)\nwidth:\(centerRect.size.width),height:\(centerRect.size.height)");

/**

如果你使用扩展提供了一个新的构造器,你依旧有责任保证构造过程能够让所有实例完全初始化

*/

//方法

/**

扩展可以向已有类型添加新的实例方法和类型方法

*/

extension Int {

func repetitons(task: () -> ()) {//表明函数没有参数而且没有返回值

for _
in 0..<self {

task();

}

}

}

3.repetitons({

print("hello~");

});

4.repetitons({

print("world!");

});

//修改实例方法

/**

通过扩展添加实例方法也可以修改该实例本身。结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样

*/

extension Int {

mutating func square() ->
Int {

return
self * self;

}

}

var someInt = 3;

print(someInt.square());

//下标

/**

扩展可以向一个已有类型添加新下标

逆向下标

*/

extension Int {

subscript(digitIndex:
Int) -> Int {

var decimalBase =
1;

if digitIndex ==
0 {

return
self % 10;

}

for _
in 1...digitIndex {

decimalBase *= 10;

}

if self / decimalBase <
1 {

return 0;

}

return (self / decimalBase) %
10;

}

}

print(73456875885[6]);

//嵌套类型

/**

扩展可以向已有的类、结构体和枚举添加新的嵌套类型

*/

extension Character {

enum Kind {

case Vowel, Consonant, Other;

}

var kind: Kind {

switch
String(self).lowercaseString {

case
"a","e","i","o","u":

return .Vowel;

case
"b","c","d","f","g","h","j","k","l","m","n","p","q":

return .Consonant;

default:

return .Other;

}

}

}

func printLetterKinds(word:
String) {

print("\'\(word)' is made up of the following kinds of letters:");

for character
in word.characters {

switch character.kind {

case .Vowel:

print("vowel");

case .Consonant:

print("Consonant");

case .Other:

print("other");

}

}

}

printLetterKinds("Hello");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: