/*
类型转换
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
*/