Swift 泛型

在看完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类型的,原来如此!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 泛型代码可以确保你写出灵活的,可重用的函数和定义出任何你所确定好的需求的类型。你的可以写出避免重复的代码,并且用一...
    iOS_Developer阅读 4,212评论 0 0
  • 附上Apple文档翻译版 1.为什么需要泛型的使用 其实说白了很简单。就是对于方法结构相同,但是由于类型不同,而需...
    mdiep阅读 2,563评论 0 4
  • Swift 提供了泛型让你写出灵活且可重用的函数和类型。Swift 标准库是通过泛型代码构建出来的。Swift 的...
    零度_不结冰阅读 3,060评论 0 0
  • 本文转载自http://blog.csdn.net/youshaoduo/article/details/5486...
    desunire阅读 5,912评论 0 0
  • 昨晚去逛了REWE,还给兔子买到了兔粮和零食,心满意足。睡觉做梦梦见了以前同事,轻松又开心(很神奇的是梦里面,她们...
    小肉丸子阅读 1,463评论 8 0

友情链接更多精彩内容