【问题标题】:Cannot convert value of type '[AnyObject]' to expected argument type '[String]'无法将类型“[AnyObject]”的值转换为预期的参数类型“[String]”
【发布时间】:2016-07-08 19:29:06
【问题描述】:

当我尝试编译这段代码时:

func lookupPlayers() {
    print("Looking up \(match?.players.count)")
    
    // Loading ID from players connected in the match
    var idsArray = NSMutableArray()
    if (match != nil) {
        for players in match!.players {
            if let player = players as? GKPlayer {
                idsArray.addObject(player.playerID!)
            }
        }
        
    }
   
    GKPlayer.loadPlayersForIdentifiers(idsArray as [AnyObject] as [AnyObject], withCompletionHandler: { (players, error) -> Void in
        if (error != nil) {
            // Handle error here
            // if we fail to retrieve player info return and end the match
            print("Error retrieving player info: \(error.localizedDescription)")
            self.matchStarted = false
            self.delegate?.matchEnded?()
        }
        else {
            // Get info from all players and start the match
            self.playersDict = NSMutableDictionary(capacity: players.count)
            for player1 in players {
                if let player = player1 as? GKPlayer {
                    print("Found player: \(player.alias)")
                    self.playersDict.setObject(player, forKey: player.playerID)
                }
            }
            self.playersDict.setObject(self.localPlayer, forKey: self.localPlayer.playerID)
            
            self.matchStarted = true
            self.delegate?.matchStarted?()
        }
    })
}

我收到此错误:

无法在此行中将类型“[AnyObject]”的值转换为预期的参数类型“[String]”:

GKPlayer.loadPlayersForIdentifiers(idsArray as [AnyObject] as [AnyObject], withCompletionHandler: { (players, error) -> Void in

我做错了什么?

【问题讨论】:

  • 首先错误告诉你[AnyObject]应该是[String]。其次,为什么会有as [AnyObject] as [AnyObject]。我认为第二个as [AnyObject] 没用。这就好比说把这个对象当成一辆车,它被当成一辆车。没有意义。您是否尝试过简单地将 [AnyObject] 替换为 [String] 并删除该行中的重复项?

标签: swift


【解决方案1】:

与这个问题非常相似: Problems with code when updating to Swift 2.0. “Cannot convert value..”

如您所知,您需要将[String] 传递给loadPlayersForIdentifiers(_:withCompletionHandler:) 的第一个参数。还有playerId! 绝对是String。为什么你NSMutableArray知道这个?

idsArray的声明改为:

    var idsArray: [String] = []

导致错误的行:

    GKPlayer.loadPlayersForIdentifiers(idsArray, withCompletionHandler: { (players, error) -> Void in

【讨论】:

    【解决方案2】:

    尝试以下方法:

    1. var idsArray = NSMutableArray() 替换为var idsArray = [String]()。这样你就可以使用 Swift 数组,而不是 Obj-C NSArrays。

    2. 然后替换:

    GKPlayer.loadPlayersForIdentifiers(idsArray as [AnyObject] as [AnyObject], withCompletionHandler: { (players, error) -> Void in if (error != nil) {

    与:

    GKPlayer.loadPlayersForIdentifiers(idsArray as [String], withCompletionHandler: { (players, error) -> Void in if (error != nil) {

    【讨论】:

      【解决方案3】:

      尝试将 idArray 声明为 Array<String>() 而不是 NSMutableArray()

      像这样:

      // Loading ID from players connected in the match
          var idsArray = Array<String>()
          if (match != nil) {
              for players in match!.players {
                  if let player = players as? GKPlayer {
                      idsArray.append(player.playerID!)
                  }
              }
      
          }
      
          GKPlayer.loadPlayersForIdentifiers(idsArray, withCompletionHandler: { (players, error) -> Void in
              if (error != nil) {
                  // Handle error here
               ...
      }
          })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多