Swift 解密

Swift 泛型

2016-01-18  本文已影响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类型的,原来如此!!!

上一篇 下一篇

猜你喜欢

热点阅读