10、类型转换、泛型、扩展、协议

2020-06-09  本文已影响0人  LucXion

类型检查 is,类似isKindOfClass,子类对象检查是否为父类的类型可以检查通过
as? 和as! 的区别,as?返回的是可选值,转换失败为nil
Any:通用类型 AnyObject:通用的引用类型
泛型

// 泛型在函数参数中的作用,多个泛型用逗号隔开
func changeTwoValue<T,J>( parama:inout T, parama2:inout T,parama3:J,parama4:J){
    let temp = parama
    parama = parama2
    parama2 = temp
}
// 定义一个泛型 + 栈结构体 (栈为单出口容器,先进后出)
struct ZStruct<Item>{
    var item:Array<Item> = []
    mutating func addItem(parama:Item){
        item.append(parama)
    }
    mutating func popItem(){
        item.removeLast()
    }
}
// 扩展:为已存在的数据类型添加功能,不需要再声明泛型
extension ZStruct {
    func getItem() -> [Item] {
        return item
    }
}

/// 泛型的限制:

// 泛型的限制:可以是协议
protocol My {
    // item可以由遵守协议的类型来定义
    associatedtype Item
    // 在协议中定义一个泛型类型的计算属性
    var type:Item{get set}
    // 在实现中第一个定义的泛型将确定协议中所有泛型的类型
    func changeType(parama:Item)->Void
}
// 泛型的限制:自定义引用类型
class Student:My {
    var type:Int {
        get{
            return 5
        }
        set{
            newValue
        }
    }
    func changeType(parama: Int) {
        print("do")
    }
    func doSome<T:Student>(parama:T)->Void{
        
    }
}

/// 泛型与where可以有更严格的约束

// where与泛型结合可以增加更严格的约束
class School<T,J> where T:My,J:My {
    
}
class Student<Item> {
    var name:Item
    init(parama:Item) {
        name = parama
    }
    func returnName()-> Item {
        return self.name
    }
}
var parama = "abc"
var stu = Student.init(parama: parama)
stu.returnName()
上一篇 下一篇

猜你喜欢

热点阅读