Swift语言的扩展与协议(接口)

 

/*   

类型转换

1.没有任何关系的两个类型之间的转换

2.继承链条里的向上与向下转型

*/

//第一种形式

let i = 3

let str = "\(i)"

let str2 = String(i)

 

//第二种形式

class Parent {

    var p = 1

}

 

class Child:Parent {

    var c = 2

}

//as是用来转换的

let c: Parent = Child()

let cc = c as? Child

cc?.c

 

if let ccc = c as?Child {

    ccc.c

}

cc!.c

// is  是用来判断这个实例是否属于这个类

let result = c is Child

//let result2 = c is Parent

 

//AnyObject:表示任何类(class)的类型

//Any:任意类型,比如结构,枚举,类,函数等等

 

class A {

    var aa: Int = 1

}

class B {

    var bb: Int = 2

}

//在Swift没有顶级父类的说法(类似java的Object)

 

let data: [AnyObject] = [A(),A(),B(),B()];

 

var any1Count = 0

var any2Conut = 0

for item in data {

    if item is A {

        any1Count++

    }else if item is B {

        any2Conut++

    }

    

    if let ins = item as? A {

        ins.aa

    }

}

any1Count

any2Conut

 

let data1: [AnyObject] = [A(),A()];

let d = data1 as! [A]

d[1].aa

 

/*

扩展:

1.可以用来扩展类,结构,枚举,协议(即使这些你没有源代码,系统的都可以)

2.可以增加但不能重写已经存在的功能

***********************************

1. 可以添加实例计算属性与静态计算属性(比如给double类型添加一些表示长度单位的计算属性)

2.添加实例方法与类方法

3.提供新的初始化方法。

    1.可以让别的类型作为新增init的参数

    2.或其它的init选项

3.给值类型通过扩展添加init,也可以保留在原值类型中由编译器自动添加的各种init

4.增加下标

5.让已存在的类型实现一个协议

 

 

不能:

1. 不能添加存储属性(应该是对 init 的影响)

2. 不能给属性添加观察者

3. 不能给类添加特定的初始化器

4. 不能给类添加析构函数

*/

//给系统Int扩展方法m km

extension Int {

    var m: Int {

        return 1

    }

    var km: Int {

        return self * 1000

    }

}

 

let ii = 20

ii.m

ii.km

 

/*

协议:就是接口的含义

 

添加属性时:

1.只指定属性的名字与类型,不指定是否是存储与计算属性

2.只能在协议中用static修饰静态属性。但在实现类型可以用class 也可以用static

3.只读属性 var a: Int {get}

4.读写属性var b: Int {get set}

5.协议中的属性总是用var声明的 ,但是在实现时可以实现为let

 

添加方法时:

1.不需要大括号

2.支持可变长度参数

3.默认值不能在协议中指明

4.静态方法也用static修饰(在协议中)

5.协议中得方法可以添加mutating,在类中得实现中,可以不需要mutating,在值类型

中得实现中就必须加mutating

*/

 

posted on 2015-11-14 23:12  陈鹤  阅读(757)  评论(0编辑  收藏  举报

导航