泛型

作者: 饮长刀 | 来源:发表于2017-03-12 10:49 被阅读15次

    Objective-C的泛型

    使用场景

    • 限制集合中的类型,减少类型转换的代码,将类型检查的工作从开发者转移给编译器。
    • 自定义类,当某个属性类型不确定,只有创建的时候才能确定时,可以使用泛型来规范这个类型。

    __covariant 与 __contravariant 的区别

    • __covariant 协变 向上转型 子类可以转父类
    • __contravariant 逆变 向下转型 父类转子类
    • 如果不声明 __convariant 或者 __contravariant 那么两个方向都不可以转换
    // Container
    @interface Container<ObjectType> : NSObject
    
    @end
    
    // Box类继承至Container
    @interface Box : Container
    
    @end
    
    // Desk
    @interface Desk<__covariant ObjectType> : NSObject
    
    @property (nonatomic, strong) Container<ObjectType> *containter;
    
    @end
    
    // 使用
    Desk<Container *> *deskA = [[Desk alloc] init];
        
    Desk<Box *> *deskB = [[Desk alloc] init];
      
    // deskB = deskA; 
    deskA = deskB;
    

    swift中的泛型

    案例
    在swift中不允许类型隐式转换,如果定义的函数是交换两个整数的,那么如果用来交换两个浮点数那是不允许的,所以需要泛型来写一个通用的函数。

    // 单一占位符的函数
    func swap<ObjectType>( number1: inout ObjectType, number2: inout ObjectType) {
        let temp = number1;
        number1 = number2;
        number2 = temp;
    }
    
    var s1 = "hello"
    var s2 = "world"
    
    swap(&s1, &s2)
    s1
    s2
    
    var i1 = 89
    var i2 = 45
    swap(&i1, &i2)
    i1
    i2
    
    // 多个占位符的泛型函数
    func conect<FirstObjectType, SecondObjectType>(num1: FirstObjectType, num2: SecondObjectType) -> String {
        let temp = "\(num1)" + "\(num2)"
        return temp
    }
    
    let re1 = conect(num1: "nihao", num2: 123)
    
    // 泛型类
    class ObjTypeClass<ObjectType> {
        var values = [ObjectType]()
        func display() {
            for i in 0  ..< self.values.count {
                print(values[i])
            }
        }
        
    }
    
    let v:ObjTypeClass<String> = ObjTypeClass<String>()
    v.values = ["hello world", "apple", "jobs"]
    v.display()
    

    相关文章

      网友评论

          本文标题:泛型

          本文链接:https://www.haomeiwen.com/subject/onstnttx.html