21.扩展

  扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模 )。扩展和 Objective-C 中的分类类似。

  Swift 中的扩展可以:

  1.  添加计算型属性和计算型类型属性
  2.  定义实例方法和类型方法
  3.  提供新的构造器
  4.  定义下标
  5.  定义和使用新的嵌套类型
  6.  使一个已有类型符合某个协议

1.扩展语法

  如果通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的。

extension SomeType {
    // 为 SomeType 添加的新功能写到这里
}

//扩展类型时让类型遵守协议
extension SomeType: SomeProtocol, AnotherProctocol {
    // 协议实现写到这里
}

2.计算型属性

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

extension Double
{
    var km: Double { return self * 1_000.0; }
    var m : Double { return self; }
    var cm: Double { return self / 100.0; }
    var mm: Double { return self / 1_000.0; }
    var ft: Double { return self / 3.28084; }
}
let oneInch = 25.4.mm;

3.构造器

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()
}

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));

4.方法

extension Int
{
    //扩展添加的方法
    func repetitions(task: () -> Void)
    {
        for _ in 0..<self
        {
            task();
        }
    }
}

//重要的事情说三遍.....
3.repetitions{
    print("Goodbye!");
};

5.下标

extension Int
{
    //扩展添加下标
    subscript(digitIndex: Int) -> Int
    {
        var decimalBase = 1;
        for _ in 0..<digitIndex
        {
            decimalBase *= 10;
        }
        return (self / decimalBase) % 10;
    }
}
print("\(123456[1])");  //"5\n"

6.嵌套类型

extension Int
{
    //嵌套的枚举类型Kind
    enum Kind
    {
        case Negative;
        case Zero;
        case Positive;
    }
    
    var kind: Kind
    {
        switch self
        {
        case 0:  //0
            return .Zero;
        case let x where x > 0:  //正数
            return .Positive;
        default:  //负数
            return .Negative;
        }
    }
}
print("\((-3).kind)");  //"Negative\n"

 

posted @ 2016-07-18 20:56  LeeGof  阅读(257)  评论(0编辑  收藏  举报