Arrays 将协议数组转换为swift中的任意对象
我有一个函数Arrays 将协议数组转换为swift中的任意对象,arrays,swift,casting,swift2,Arrays,Swift,Casting,Swift2,我有一个函数storeInCache,它接受AnyObject? 当我尝试给它一个可选的协议对象数组时,它失败了,出现编译错误“无法使用类型为“([HasImage]?,String)”的列表参数调用“storeInCache””。基本上它不能转换 [HasImage]?对任何物体?我相信 我不明白这一点,因为数组包含对象(符合HasImage协议yes),它是数组,所以它是AnyObject no 我尝试了不同的铸造方法,但都不管用。 如何在swift中解决这一问题 示例代码: protoco
storeInCache
,它接受AnyObject?
当我尝试给它一个可选的协议对象数组时,它失败了,出现编译错误“无法使用类型为“([HasImage]?,String)”的列表参数调用“storeInCache”
”。基本上它不能转换
[HasImage]?对任何物体?我相信
我不明白这一点,因为数组包含对象(符合HasImage协议yes),它是数组,所以它是AnyObject no
我尝试了不同的铸造方法,但都不管用。
如何在swift中解决这一问题
示例代码:
protocol HasImage {
var imageUrl : String? {get}
}
class Product : NSObject, HasImage {
var imageUrl : String?
init(imageUrl : String?) {
self.imageUrl = imageUrl
}
}
func storeInCache(obj : AnyObject?, key : String)
{
//if no object supplied nothing to store in cache!
//...
}
func testCaching(addDummyData : Bool) {
var objectsWithImages : [HasImage]?
if addDummyData {
objectsWithImages = [Product(imageUrl: "http://wwww.someserver.com/p1/image.jpg"),Product(imageUrl: "http://wwww.someserver.com/p2/image.jpg")]
}
//fails compilation with => cannot invoke 'storeInCache' with an argument of list of type '([HasImage]?, String)'
storeInCache(objectsWithImages,"somekey")
}
将@objc添加到您的协议声明中,应该可以了
@objc
protocol HasImage {
var imageUrl : String? {get}
}
最后一行应该是
storeInCache(objectsWithImages,key:“somekey”)
,对吗?不,显然它不需要标签,可能是因为该函数是一个通用函数(不是类的成员函数)。如果它不需要标签,那么我想,您使用的是Swift 1.2。我以为你在使用Swift 2.0,因为你用swift2
标记了这个问题。你能解释一下为什么这会产生不同的结果吗?这个把戏既神奇又怪异,最好能解释一下:D