在完成处理程序中,无法将类型'()'的值赋给'[customObject]'类型

时间:2017-01-20 01:40:54

标签: ios json swift object

我正在尝试在json数据更新后重新加载集合视图但遇到错误:

  

无法指定类型'()'的值来键入'[ChannelInfo]'

这就是我如何设置自定义对象'ChannelInfo':

class ChannelInfo: NSObject {

  var logo: String?
  var channelName: String?
  var id: NSNumber?


  init(logo: String, channelName: String , id: NSNumber) {

    self.logo = logo
    self.channelName = channelName
    self.id = id
  }

  init(resDictionary: [String:Any]) {

    logo = resDictionary["artwork_608x342"] as? String
    channelName = resDictionary["name"] as? String
    id = resDictionary["id"] as? NSNumber

  }


  static func updateAllChannels(completionHandler:@escaping (_ channels: [ChannelInfo]) -> Void){

    let nm = NetworkManager.sharedManager// singleton handles network connections and json parsing


    nm.getJSONData(urlExtension: "channels/all/0/50", completion: {
      data in

      var channels = [ChannelInfo]()

      if let jsonDictionary = nm.parseJSONFromData(data)
      {
        let resultsDictionaries = jsonDictionary["results"] as! [[String : Any]]
        for resultsDictionary in resultsDictionaries {// enumerate through dictionary
          let newChannel = ChannelInfo(resDictionary: resultsDictionary)
          channels.append(newChannel)
        }
      }
      completionHandler(channels)

    })
  }
}

这是我在更新json对象后重新加载集合视图的方法:

 var channelArray: [ChannelInfo] = []

      override func viewDidLoad() {

        channelArray = ChannelInfo.updateAllChannels(completionHandler: { _ in

        self.channelCollectionView.reloadData()
        })//Error happens here starting with 'channelArray'
    }

我觉得我可能错过了一步,感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

好的,让我们一步一步。你在说

ChannelInfo.updateAllChannels...

那么让我们看看如何声明updateAllChannels方法:

static func updateAllChannels(
    completionHandler:@escaping (_ channels: [ChannelInfo]) -> Void){

所以这是一个返回 no result 的静态函数。

但你实际所说的是:

channelArray = ChannelInfo.updateAllChannels...

但我们刚刚确定updateAllChannels返回无结果。因此,您无需分配给channelArray。这里的整个分配概念毫无意义。而且编译器告诉你了。您不能拥有此作业channelArray =。删除那部分。

(但不要引用我)你的大问题是你忽略了返回给完成处理程序的值。你有这个:

ChannelInfo.updateAllChannels(completionHandler: { _ in
    self.channelCollectionView.reloadData()
})

请参阅第一行末尾的_ in?我认为这是你的整个问题。 updateAllChannels正在将channels作为参数交还给您,而您将它们扔掉。相反,我认为你想要这样的东西:

ChannelInfo.updateAllChannels(completionHandler: { channels in
    channelArray = channels
    self.channelCollectionView.reloadData()
})