swift从入门到精通14-协议

281 阅读2分钟

1.协议

协议可以用来定义方法、属性、下标的声明,协议可以被枚举、结构体、类遵守(多个协议之间用逗号隔开)。协议定义的方法不能有默认的参数值,且定义的内容必须实现。

  • 定义属性必须用var
  • 实现协议的权限需不小于协议的权限

例子:

protocol TestAble {
    func hello()
    var x: Int{set get}
    subscript(index: Int) -> Int{set get}
}


class TestClass: TestAble {
    func hello() {
        print("hello word")
    }
    var x: Int = 0
    subscript(index: Int) -> Int {
        get {
            return index
        }
        set {
        }
    }
}

2.static、class

为了保证通用,协议中必须用static定义类型方法、类型属性、类型下标。

例子:

protocol Test2Able {
    static func hello()
}

class Test2Class: Test2Able {
    static func hello() {}
}

class Test22Class: Test2Able {
    class func hello() {}
}

3.mutating

只有协议中的实例方法标记为mutating,结构体和枚举才可以修改自身内存,类不用。

例子:

protocol Test3Able {
    mutating func hello()
}

struct Test3Class: Test3Able {
    var x = 5
    mutating func hello(){
        x = 10
    }
}

class Test33Class: Test3Able {
    var x = 5
    func hello() {
        x = 10
    }
}

4.init

协议中还可以定义初始化器init , 非final类实现时必须加上required。如果从协议实现的初始化器刚好是重写了父类的指定初始化器,那么这个初始化必须同时加required、override。

例子:

protocol TestAble {
    init(age: Int)
}

class Person {
    init(age: Int){}
}

class Sutdent: Person,TestAble {
    required override init(age: Int) {
        super.init(age: age)
    }
}

5.Any ,AnyObject

any:可以代表任意类型,包括枚举,结构体,类。

anyobject:可以代表类类型。

例子:

var x: Any = 5.0
x = "abc"

class AClass {
}
class BClass {
}

var a: AnyObject = AClass.self
a = BClass.self

6.is,as?,as!,as

is:用来判断是否是某种类型

as:用来强制类型转换

例子:

var x: Any = 5.0
x = "abc"

class AClass {
    func hello(){
        print("hello")
    }
}

x = AClass()
if (x is AClass) {
    print("x is Aclass")
}

(x as? AClass)?.hello()
(x as! AClass).hello()

7.X.self,X,Type,X.AnyClass

x.self是一个元类型指针。x.self也有自己类型,是属于x.Type。

var stuType: Student.Type  = Student.self 

也可以定义一个接收任意类型的变量 AnyObject.Type

其中AnyClass:就是 AnyObject.Type的别名

var anyType: AnyObject.Type = Person.selfvar anyType2 : AnyClass = Student.self

8.Self

self代表当前类型,一般用作返回值类型。

例子:

protocol AAble {
    func hello() -> Self
}

class DClass: AAble {
    required init() {
    }
    func hello() -> Self {
        type(of: self).init()
    }
}

上一篇文章:swift从入门到精通13-可选链

下一篇文章:swift从入门到精通15-错误处理