zoukankan      html  css  js  c++  java
  • 【iOS】Swift扩展extension和协议protocol

    加上几个关节前Playground摘要码进入github在,凝视写了非常多,主要是为了方便自己的未来可以Fanfankan。

    Swift语法的主要部分几乎相同的。

    当然也有通用的、运算符重载、ARC、补充倒闭之类的。


    一、扩展(extension)

    扩展 extension (类似OC中的分类Swift中没有名字), 即在没有权限获取到原始代码的情况下为类添加新功能.

    注意: 仅仅要定义了扩展, 那么该扩展对该类的实例都是可用的.

    extension SomeType{
        //加入到SomeType的新功能写在这里
    }

    1.1扩展属性(仅仅能是计算属性)

    //扩展能够加入新计算属性, 可是不能加入存储属性(也不能够加入属性观察).
    extension Double{  //为API中的已有类型加入实例属性
        var km : Double { return self * 1_000.0 }
        var m : Double { return self }
        var cm : Double { return self / 100.0 }
    }
    
    let jjLength = 1.m  // 1与m进行点运算, 表示1的Double值
    let jjLength_km = 1.km
    println(10.km + 1.m)

    1.2扩展构造器

    //能够定制自己的构造器
    class MyClass{
        var a : Int
        init(){
            a = 10
        }
    }
    
    extension MyClass{
        convenience init(var parm:Int){   //扩展构造器
            self.init()
            println("扩展构造器--->便利构造器, (parm)")
        }
    }
    
    var myClass = MyClass(parm: 9)

    1.3扩展方法

    以下是像Int中扩展myIntFunc方法

    extension Int{
        func myIntFunc(){
            println("值为(self) , 哈哈哈哈!")
        }
    }
    
    1.myIntFunc()

    1.3.1 改动实例方法

    通过扩展方法, 能够改动该实例self本身.可是方法前要加 mutating

    extension Double{
        mutating func myMoidfySelfValue{
            self = self * self //改动self实例的值
        }
    }
    
    var d = 2.0
    d.myMoidfySelfValue()

    1.4 扩展嵌套类型

    即向已有的嵌套类型中加入新的嵌套类型. 还能够扩展下标(附属脚本).

    extension Character {
        enum Kind{   //嵌套了一个枚举类型
            case Big
            case Small
        }
        var k : Kind{
            if(String(self).lowercaseString == "a"){
                return Kind.Big
            }else{
                return Kind.Small
            }
        }
    }
    var ch : Character = "a"
    ch.k   //返回一个枚举值Kind.Big

    二、协议(protocol)

    可定义方法与属性, 由详细的类去实现. 越来越像Java

    Swift中的协议能被类, 枚举,结构体实现.

    protocol SomeProtocol{
        //协议内容
    }
    
    class SomeClass : SomeProtocol{ //实现协议, 可实现多个协议
        
    }

    2.1 协议中属性/方法/突变方法的要求

    2.1.1 属性的要求

    protocol AnotherProtocol1{
        //class表示类成员(结构体/枚举中用static)
        class var property : Int { get set} //get, set 表示可读可写
    }
    
    class AnotherClass1 : AnotherProtocol1{
        class var property : Int {  //实现协议中的属性
            get{
                return 10
            }
            set{
                
            }
        }
    }

    2.1.2 方法要求

    //不支持默认參数. 写法上仅仅是没有方法的实现.
    protocol AnotherProtocol2{
        func myFunc() -> Int   //仅仅声明不实现
    }
    
    class AnotherClass2 : AnotherProtocol2{
        func myFunc() -> Int {  //实现方法
            return 10
        }
    }

    2.1.3 突变方法要求

    能在方法或函数内部改变实例类型的方法称为突变方法. (mutatingkeyword)

    在类中,能够不写mutating, 但在结构体与枚举中国必须写

    protocol Togg{
        mutating func togg()
    }
    
    enum OnOffSwitch : Togg{
        case Off , On
        
        mutating func togg() { //改变实例的值
            switch self{
            case .Off:
                self = On
            case .On:
                self = Off
            }
        }
    }
    
    var lightSwitch = OnOffSwitch.Off
    lightSwitch.togg()   //值变为On

    2.2 协议类型.

    协议也能够当做类型来使用. 这点和函数一样.

    1.可作为參数/返回值类型

    2.可作为常量/变量/属性的类型

    3.可作为数组/字典和其它元素类型

    protocol MyRect{
        func myLuckNumber() -> Int
    }
    
    class MyRectImp : MyRect{
        func myLuckNumber() -> Int {
            return 10
        }
    }
    
    class Dice {
        let sides :Int
        var gener : MyRect    //作为类型
        init(sides:Int, gener:MyRect){  //作为參数
            self.sides = sides
            self.gener = gener
        }
    }
    
    var dice = Dice(sides: 6, gener: MyRectImp())
    dice.gener.myLuckNumber()   //返回10

    演示样例代码见:http://github.com/xn4545945/SwiftLearning


    參考:

    The Swift Programming Language  

    Apple Dev Center


    转载请注明出处:http://blog.csdn.net/xn4545945  



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    (转)运行pip报错:Fatal error in launcher: Unable to create process using '"'
    (转)pycharm autopep8配置
    Hash
    Java 8 Lambda表达式
    位运算
    PHP数组操作大全
    php final static const成员属性用法
    Java编程性能优化
    java中double变量保留小数问题
    encodeURIComponent编码后java后台的解码
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4840720.html
Copyright © 2011-2022 走看看