Objective c Swift中的模拟NSCache通用方法

Objective c Swift中的模拟NSCache通用方法,objective-c,swift,Objective C,Swift,我试图通过构建一个协议来模拟NSCache,NSCache可以遵守该协议,以便使用依赖注入。我似乎不知道如何或是否可以将通用方法添加到协议中。例如,NSCache有以下方法: openfunc removeObject(forKey:KeyType) 因此,如果在我的协议中,我试图声明: func removeObject(forKey键:KeyType) Xcode表示NSCache不符合协议,当我尝试单击FixIt添加存根时,它会添加: func removeObject<KeyTyp

我试图通过构建一个协议来模拟NSCache,NSCache可以遵守该协议,以便使用依赖注入。我似乎不知道如何或是否可以将通用方法添加到协议中。例如,NSCache有以下方法:

openfunc removeObject(forKey:KeyType)

因此,如果在我的协议中,我试图声明:

func removeObject(forKey键:KeyType)

Xcode表示NSCache不符合协议,当我尝试单击FixIt添加存根时,它会添加:

func removeObject<KeyType>(forKey key: KeyType) where KeyType : AnyObject {
    
}
func removeObject(forKey键:KeyType),其中KeyType:AnyObject{
}
然后该行有一条错误消息:

泛型Objective-C类的扩展无法在运行时访问该类的泛型参数


我怎么能模仿这样的东西呢?

你的尝试注定要失败,因为Objective-C泛型的工作方式,它们与Swift泛型不完全兼容。您需要将
NSCache
封装在一个Swift类中,如果您想走这条路,则需要模拟该类

但我想说的是,你需要一个模拟。您的
NSCache
实例的工作方式类似于数据库,那么为什么不直接注入它,而不是在执行一些操作后基于缓存内容的协议和断言呢

比如说

需要缓存测试的类MyClasss:xTestCase{
设nsCache=nsCache()
让sut=myclassthaneedsacache(缓存:nsCache)
func testBehaviorWhenCacheIsEmpty(){
sut.doSomething()
//断言需要什么
}
func testBehaviorWithCachedData(){
setObject(someValue,forKey:somekey)
sut.doSomethingElse()
//断言需要什么
}
}

一般来说,我建议使用嘲弄作为最后手段。模拟将测试和它们测试的实现紧密地结合在一起,因为您必须使测试与实现保持同步。如果有可能的话,输入->输出测试是最可靠和最健壮的测试。

也许有点离题,但是如果你在模拟一个类,为什么你必须将它包括在模拟中?这不是嘲弄的真正含义。