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-可选链