在看完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.pngObjectA 类定义的泛型 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类型的,原来如此!!!
网友评论