协议数组转换为swift中的任何对象

时间:2015-08-28 10:01:12

标签: arrays swift casting swift2

我有一个接受storeInCache

的函数AnyObject?

当我尝试为它提供一个可选的协议对象数组时,它会因编译错误而失败" cannot invoke 'storeInCache' with an argument of list of type '([HasImage]?, String)'"。基本上它无法转换 [HasImage]?到AnyObject?我相信。

我不明白这一点,因为数组包含对象(符合HasImage协议的是),它是一个数组,所以它的AnyObject没有?

我尝试了不同的投射方式,但没有一种方法可行。 如何在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")
}

1 个答案:

答案 0 :(得分:4)

将@objc添加到您的协议声明中,它应该没问题,

@objc
protocol HasImage {
    var imageUrl : String? {get}
}