Swift 泛型

作者: 楼上那位 | 来源:发表于2016-01-18 12:22 被阅读97次

    在看完apple 官方文档以后还是有点不懂,遇到我们自己写泛型就又好多问题,这里有几个小问题swift社区问答让我想起需要重新梳理一下泛型的知识了

    struct Stack<T>{
        var items = [T]();
     mutating func push(item :T) {
     items.append(item);
    } 
    mutating func pop()->T  {
    return items.removeLast()
         } 
    }
    

    泛型函数

    func generic(param1 :T , param2:T)->T { }    
    # 泛型类
    class TypeA: NSObject {   
      override init() {   
         print("TypeA");    
      }
    } 
    
    class ObjectA: NSObject {
        var type = [T]();
        init(type:T) {
         self.type.append(type);
    }
    func addNewTyep(){
    let newType = TypeA();
    self.type.append(newType);
     }
    }
    

    上述代码会有一个问题

    屏幕快照 2016-01-18 11.43.43.png

    ObjectA 类定义的泛型 T 遵从类 TypeA,定义的数组是[T],进行append操作时候,不能匹配具体的 TypeA,所以报错。可以把 type 换成 [TypeA], 因为泛型 T 是表示 TypeA 或者 它的子类。所以[TypeA] 可以 append T 或者 TypeA:,所以 将上述代码修改如下:

     var type = [T]();
    

    还有一个有趣的问题,

    var string = "Hello, world!"
    var firstChar:Character = string[0] // Throws error
    

    会报错哦!!!这是为何??

    for character in "Dog!🐶".characters {
        print(character)// 完美
    }
    
    let string = "Hello, world!"
     var firstChar:Character = string.characters.first!; 
    // 这样写也没有问题         完美
    

    原来是string没有subscribe的问题,与C++ 好不一样哦,咋办 ?
    那就添加subscribe 呗

    extension String {
        
        subscript (i: Int) -> Character {
            return self[self.startIndex.advancedBy(i)]// 这个self[ ]调用的是谁的subscript呢?
        }
        
        subscript (i: Int) -> String {
            return String(self[i] as Character)
        }
        
        subscript (r: Range<Int>) -> String {
            let start = startIndex.advancedBy(r.startIndex)
            let end = start.advancedBy(r.endIndex - r.startIndex)
            return self[Range(start: start, end: end)]
        }
    }
    

    查看一下apple 的文档,发现

    extension String {
        public typealias Index = String.CharacterView.Index
        /// The position of the first `Character` in `self.characters` if
        /// `self` is non-empty; identical to `endIndex` otherwise.
        public var startIndex: Index { get }
        /// The "past the end" position in `self.characters`.
        ///
        /// `endIndex` is not a valid argument to `subscript`, and is always
        /// reachable from `startIndex` by zero or more applications of
        /// `successor()`.
        public var endIndex: Index { get }
        public subscript (i: Index) -> Character { get }
    }
    

    原来subscript参数是Index类型的,不是Int类型的,原来如此!!!

    相关文章

      网友评论

        本文标题:Swift 泛型

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