类型转换,接口和扩展

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

let i = 3
let str = "(i)"    //插值法
let str2 = String(i)  //强制转换

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

class Parent{
   var p = 1
}

class Child: Parent {
   var c = 2
}

let pins: Parent = Child()
  //这时要访问子类的c就要判断了
let cins = pins as? Child //返回的是Optional
 cins?.c  //访问到了子类的c
//optional 用 if 绑定
if let cins2 = pins as? Child {
   cins2.c
}
 cins!.c   //显示解封

let cins3 = pins as! Child 
cins3.c
let result = pins is Child //判断是否是Child类型,返回true or false
let result2 = pins is Parent

AnyObject:表示任意类(class)的类型
Any:任意类型,比如结构,枚举,类,函数等等

class ForAny1 {
   var fa  = 2
}
class ForAny2 {
   var fa2 = 3
}
let data:[AnyObject] = [ForAny1(),ForAny2(),ForAny1(),ForAny1(),ForAny2()] //用data来存放不同的类

var any1Count = 0
var any2Count = 0
for item in data {
   if item is ForAny2 {
       any2Count++
   }
   
   if let ins = item as? ForAny1 {
       ins.fa   //输出fa的值
   }
   
}

any2Count  //找出ForAny2()的个数 
let dataA:[AnyObject]
= [ForAny1(),ForAny1(),ForAny1()] //定义一个ForAny1()的数组类
let data2
= dataA as! [ForAny1] //把值赋给data2去接收
data2[
0].fa //取出fa的值

扩展

不能:
1. 不能添加存储属性(应该是对 init 的影响)
2. 不能给属性添加观察者
3. 不能给类添加特定的初始化器
4. 不能给类添加析构函数

 给int类型添加计算属性

extension Int {
    var m: Int {
       return 1
    }
    var km: Int {
        return self * 1000
    }
}

let i = 20
i.m
i.km

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

,系统的都可以)
2. 可以增加但不能重写已存在的功能
------------------------
1. 可以添加实例计算属性与静态计算属性(比如给double类型添加

一些表示长度单位的计算属性)
2.添加实例方法与类方法
3.提供新的初始化方法。
    1.可以让别的类型作为新增init的参数
    2.或其它的init选项
3.给值类型通过扩展添加init,也可以保留在原值类型中由编译器

自动添加的各种init
4.增加下标
5.让已存在的类型实现一个协议

协议

协议:就是接口的含义

添加属性时:
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

//通过某个拓展类来实现某个协议

protocol ExampleProtocol{
    var simpleDescription: String{get}
    mutating func adjust()


}

extension Int:ExampleProtocol{
    var simpleDescription: String
        {
    return "The number(self)"
    
    
    }
   mutating func adjust() {
        self+=42
    }




}
var jj:Int=20
jj.adjust()
jj.simpleDescription


















原文地址:https://www.cnblogs.com/kangniuniu/p/4957343.html