&#39;诠释&#39;不能转换为&#39; Range <int> </int>

时间:2015-01-22 21:32:19

标签: arrays swift

我有一个PFObjects数组,我创建了一个新数组:restaurantNames来存储他们所有的名字。现在我正在尝试在UIPageView上打印名称,但是我收到错误:

'Int' is not convertible to 'Range<Int>'

代码:

private func getItemController(itemIndex: Int) -> PageItemController? {

    let restaurantNames = finalRestaurantArray.map { $0.objectForKey("Name") }

    if itemIndex < finalRestaurantArray.count {
        let pageItemController = self.storyboard!.instantiateViewControllerWithIdentifier("ItemController") as PageItemController
        pageItemController.itemIndex = itemIndex
        pageItemController.restaurantName = restaurantNames[itemIndex]
        //pageItemController.imageName = finalRestaurantArray[itemIndex]
        return pageItemController
    }

    return nil
}

实际的PFObject数组看起来像这样(restaurantNames包含只是名字的数组):

[<Restaurant: 0x7feb9252cfc0, objectId: LA74J92QDA, localId: (null)> {
    Name = "Restaurant 1";        
    City = "New York";
    Closed = 1;
    Country = "United States";
    FoodType = Japanese;
}, <Restaurant: 0x7feb926afa00, objectId: 0aKFrpKN46, localId: (null)> {
    Name = "Restaurant 2";        
    City = "San Francisco";
    Closed = 1;
    Country = "United States";
    FoodType = Italian;
}]

Pastebin:http://pastebin.com/U63TFMRV

1 个答案:

答案 0 :(得分:2)

这一行让编译器感到困惑:

let restaurantNames = finalRestaurantArray.map { $0.objectForKey("Name") }

这会创建一个[AnyObject?],这对于编译器来说是一个非常难以处理的问题,并且您获得的错误通常会令人困惑(因为各种促销和重载)。

第1步是尽可能避免使用AnyObject。所以finalRestaurantArray应该是实际对象的数组而不是[AnyObject],甚至是字典。那么你的地图会返回[String],就像我相信你想要它一样。

可以将其破解到这样的位置:

// Avoid this
let restaurantNames = finalRestaurantArray.map { $0.objectForKey("Name") as String }

如果出现任何问题,它会崩溃。不要那样做。尽可能快地从AnyObject中获取您的数据(并尽可能快地从Dictionary中获取),并将其转换为真正的模型对象,以确保它们能够返回值。