接口和扩展

来源:互联网 发布:个人业务介绍源码 编辑:程序博客网 时间:2024/05/22 01:31

//: Playground - noun: a place where people can play


import UIKit


//使用 protocol 来声明一个接口。

protocol ExampleProtocol {

   var simpleDescription:String { get }

   mutating func adjust()

}

//类、枚举和结构体都可以实现接口。

class SimpleClass:ExampleProtocol {

   var simpleDescription:String = "A very simple class."

   var anotherProperty:Int = 120

   func adjust() {

        simpleDescription +=" Now 100% adjust."

    }

   func add() {

        simpleDescription +=" Now 50% add."

    }

}

var a =SimpleClass()

a.adjust()

let aDescription =a.simpleDescription


struct SimpleStructure:ExampleProtocol {

   var simpleDescription:String = "A aimple structure"

   mutating func adjust() {

        simpleDescription +=" (adjusted)"

    }

}

var b =SimpleStructure()

b.adjust()

let bDescription =b.simpleDescription


enum SimpleEnum:ExampleProtocol {

   case First(String), Second(String), Third(String)

    

   var simpleDescription:String {

       get{

           switch self {

           case let .First(text):

               return text

           case let .Second(text):

               return text

           case let .Third(text):

               return text

           default:

               return "get error"

            }

        }

       set {

           switch self {

           case let .First(text):

               self = .First(newValue)

           case let .Second(text):

               self = .Second(newValue)

           case let .Third(text):

               self = .Third(newValue)

            }

        }

    }

    

    mutating func adjust() {

       switch self {

       case let .First(text):

           self = .First(text +" (first case adjust)")

       case let .Second(text):

           self = .Second(text +" (Second case adjust)")

       case let .Third(text):

           self = .Third(text +" (Third case adjust)")

        }

    }

}

var c =SimpleEnum.First("FirstVal")

c.simpleDescription

c.adjust()

c.simpleDescription

var d =SimpleEnum.Second("Hello")

var text =d.simpleDescription

d.simpleDescription ="Word"

text = d.simpleDescription

d.adjust()

text = d.simpleDescription

//注意声明 SimpleStructure时候 mutating 关键字用来标记一个会修改结构体的方法。SimpleClass的声明不需要标记 任何方法因为类中的方法经常会修改类。


//使用 extension来为现有的类型添加功能,比如添加一个计算属性的方法。你可以使用扩展来给任意类型添加协议,甚至是你从外部库或者框架中导入的类型。

extensionInt:ExampleProtocol {

   var simpleDescription:String {

        return"The number \(self)"

    }

   mutating func adjust() {

       self += 42

    }

}

//你可以像使用其他命名类型一样使用接口名——例如,创建一个有不同类型但是都实现一个接口的对象集合。当你处理类型是接口的值时,接口外定义的方法不可用。

let protocolValue:ExampleProtocol =a

protocolValue.simpleDescription

//即使 protocolValue变量运用时的类型是 simpleClass,编译器会把它的类型当做 ExampleProtocol。这表示你不能调用类在它实现的接口之外实现的方法或者属性。





























0 0
原创粉丝点击