美文网首页Swift
21.Swift学习之扩展

21.Swift学习之扩展

作者: YungFan | 来源:发表于2018-11-08 08:53 被阅读190次

    扩展

    • 为现有的类、结构体、枚举类型、协议添加了新功能。扩展和 Objective-C 中的分类类似。
    • 扩展可以:
      • 添加计算属性;
      • 定义方法;
      • 提供新的构造函数;
      • 使现有的类型遵循某协议
    • Swift中使用extension关键字实现扩展

    语法

    extension SomeType {
        // new functionality to add to SomeType goes here
    }
    

    扩展可以使已有的类型遵循一个或多个协议。在这种情况下,协议名的书写方式与类或结构体完全一样:

    extension SomeType: SomeProtocol, AnotherProtocol {
        // implementation of protocol requirements goes here
    }
    

    扩展计算属性

    • 扩展可以向已有的类型添加计算实例属性和计算类型属性。
    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 }
    }
    25.0.km
    25.0.m
    25.0.cm
    25.0.mm
    3.0.ft
    

    扩展构造函数

    • 扩展可向已有的类型添加新的初始化器
    extension CGRect{  
        init(center: CGPoint, size: CGSize) {
            let originX = center.x - size.width * 0.5   
            let originY = center.y - size.height * 0.5    
            self.init(x: originX, y: originY, width: size.width, height: size.height)       
        }    
    }
    let centerRect = CGRect(center: CGPoint(x: 100.0, y: 100.0), size: CGSize(width: 100.0, height: 100.0))
    

    扩展方法

    • 扩展可以为已有的类型添加新的实例方法和类型方法。
    extension Int {
        func repetitions(task: () -> Void) {
            for _ in 0..<self {
                task()
            }
        }
    }
    
    
    3.repetitions {
        print("Hello!")
    }
    

    扩展mutating方法

    • 扩展结构体,如果要修改里面的值,必须在方法面前加上mutating
    extension Int {
        mutating func square() {
            self = self * self
        }
    }
    //必须用变量,因为它的值要被修改
    var someInt = 3
    someInt.square()
    

    使现有的类型遵循某协议

    class ViewController : UIViewController{
    }
    
    extension ViewController : UITableViewDataSource{
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            
            return 10
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            
            return UITableViewCell()
        }
    }
    

    面向协议编程

    针对某个需要实现的功能,可以使用协议定义出接口,然后利用协议扩展提供默认的实现。需要这个功能,只需要声明遵守了这个协议即可,遵守某个协议的对象调用协议声明的方法时,如果遵循者本身没有提供实现,协议扩展提供的默认实现会被调用。

    • 案例
    protocol Eatable {
        func eat()
    }
    
    //如果有100个遵循者实现够一样,那么就会重复
    class Person: Eatable {
        func eat() {
            print("吃饭了")
        }
    }
    
    var p = Person()
    p.eat()
    
    • 改进,在协议中给出一个默认实现
    extension Eatable {
        func eat() {
            print("吃饭了")
        }
    }
    class Person: Eatable {
    }
    var p = Person()
    p.eat()
    
    • 如果某一个遵循者需要独特的实现,自己再实现协议中的方法即可
    class Person: Eatable {
        
        func eat() {
            print("人要吃饭了")
        }
    }
    
    var p = Person()
    p.eat()
    
    

    相关文章

      网友评论

        本文标题:21.Swift学习之扩展

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