欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Swift4 基础部分: Extensions(扩展)

程序员文章站 2024-02-20 15:04:40
...

本文是学习《The Swift Programming Language》整理的相关随笔,基本的语法不作介绍,主要介绍Swift中的一些特性或者与OC差异点。

系列文章:

Extensions add new functionality to an existing class, 
structure, enumeration, or protocol type. This includes the 
ability to extend types for which you do not have access to 
the original source code (known as retroactive modeling). 
Extensions are similar to categories in Objective-C. (Unlike 
Objective-C categories, Swift extensions do not have names.)

Extensions in Swift can:

Add computed instance properties and computed type properties
Define instance methods and type methods
Provide new initializers
Define subscripts
Define and use new nested types
Make an existing type conform to a protocol
  • Swift中的扩展与OC中的类别很相似,阔以用来扩展方法,属性,同时还可以提供新的构造器,定义下标,定义与使用新的嵌套类型,使这个扩展实现某个协议。

计算属性(Computed Properties)

Extensions can add computed instance properties and computed 
type properties to existing types.
  • 扩展可以添加计算属性到已有类中。

例子:

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 / 1_000.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");

执行结果:

One inch is 0.0254 meters
Three feet is 0.914399970739201 meters

构造器(Initializers)

Extensions can add new initializers to existing types.

例子:扩展Rect通过center,size计算Rect的值

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


// MARK: - 添加一个扩展通过center,size计算rect
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(centerRect);

方法(Methods)

Extensions can add new instance methods and type methods to existing types.
  • 扩展的方式可以添加新的实例方法和类方法到该类型。

例子:

extension Int {
    func repetitions(task: () -> Void){
        for index in 0..<self{
            task();
        }
    }
    
    func toBinary() -> String {
        return String(self,radix:2);
    }
    
    // 必须用mutating修饰才能修改自身
    mutating func square() {
        self = self * self
    }
}

3.repetitions(task:{
     print("Hello");
})
print(3.toBinary());

var someInt:Int = 3;
someInt.square();
print(someInt);

执行结果:

Hello
Hello
Hello
11
9

定义下标(Subscripts)

Extensions can add new subscripts to an existing type.

例子:

extension Int {
    subscript(digitIndex:Int) -> Int{
        var decimalBase:Int = 1;
        for index in 0..<digitIndex{
            decimalBase *= 10;
        }
        
        return (self / decimalBase) % 10;
    }
}

print(123456[2]);
print(123456[3]);
print(123456[4]);

执行结果:

4
3
2 

嵌套类型(Nested Types)

Extensions can add new nested types to existing classes, structures, and enumerations

例子:

extension Int {
    enum Kind {
        case negative,zero,positive;
    }
    
    var kind:Kind{
        switch self{
        case 0:
            return .zero;
        case let x where x > 0:
            return .positive;
        default:
            return .negative;
        }
    }
}


print(12345.kind);
print(0.kind);
print((-12345).kind);

执行结果:

positive
zero
negative