美文网首页Swift学习
Swift4 基础部分: Extensions(扩展)

Swift4 基础部分: Extensions(扩展)

作者: Arnold134777 | 来源:发表于2017-11-07 22:02 被阅读91次

    本文是学习《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
    

    相关文章

      网友评论

        本文标题:Swift4 基础部分: Extensions(扩展)

        本文链接:https://www.haomeiwen.com/subject/nbssmxtx.html