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