【问题标题】:Type "Any" has no subscript members / Swift 3 [duplicate]类型“Any”没有下标成员/Swift 3 [重复]
【发布时间】:2016-09-28 17:35:00
【问题描述】:

在 Swift 2 中一切正常,但在 Swift 3 升级后却失败了。它只是给出以下错误:

类型“Any”没有下标成员

在下面一行:

for video in JSON["items"] as? NSArray {

我之前的问题和解决方法可以在这里找到:

Ambiguous use of 'subscript' with NSArray & JSON

我在输入问题时也查看了建议的问题和答案,但到目前为止还没有找到解决方案。

class videoModel: NSObject {

let API_KEY = "Xxxxxxxxxxx"

let UPLOADS_PLAYLIST_ID = "yyyyyyyyyyyyyyy"


var videoArray = [Video]()

var delegate: VideoModelDelegate?

let urladdress = "https://www.googleapis.com/youtube/v3/playlistItems"


func getFeedVideos() {

    Alamofire.request((urladdress), method: .get, parameters: ["part":"snippet", "playlistId": UPLOADS_PLAYLIST_ID,"key": API_KEY, "maxResults": "50"], encoding: JSONEncoding.default).responseJSON(completionHandler: { (response) -> Void in

        if let JSON = response.result.value  {

            var arrayOfVideos = [Video]()

            print(JSON)

           for video in JSON["items"] as? NSArray {

                let videoObj = Video()
                videoObj.videoId = video.valueForKeyPath("snippet.resourceId.videoId") as! String
                videoObj.videoTitle = video.valueForKeyPath("snippet.title") as! String
                videoObj.videoDescription = video.valueForKeyPath("snippet.description") as! String
                videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.maxres.url") as! String

                arrayOfVideos.append(videoObj)

            }

            self.videoArray = arrayOfVideos

            if self.delegate != nil {

                self.delegate?.dataReady()

            }
        }
    })
}
}

【问题讨论】:

  • 嘿,你解决了这个问题吗,如果是,请分享最终答案。我有完全相同的错误。我也在使用完全相同的代码。请在修复此错误后分享最终代码。谢谢
  • 请看这个:cl.ly/02030q1Q0E10。如果您需要更多信息,请告诉我。
  • 你能分享课程的完整源代码吗?我仍然有问题:如果让 JSON = response.result.value as? NSArray,总是假的
  • 请在下面的链接中找到完整的源代码; dl.dropboxusercontent.com/u/20847754/videoModel.swift
  • 嘿,你能和我分享整个项目吗?我真的很难修复它。我尝试了一切来运行,但我仍然遇到项目问题。请帮我。谢谢

标签: ios swift alamofire


【解决方案1】:

您需要将JSON 对象的类型指定为[String : Any]

 if let JSON = response.result.value  as?  [String : Any] {
       if let items =  JSON["items"] as? [[String : Any]] {
            for video in items {
                  //Here use video["snippet.resourceId.videoId"] instead of value for key
            }
       }
 }

注意:如果您使用 swift 通用数组和字典对象而不是 NSArrayNSDictionary,那么在 swift 中会很糟糕。

【讨论】:

  • 当我这样做时,我在下一行得到一个错误;对于 JSON["items"] 中的视频作为? NSArray 并建议我将其更改为以下内容:for video in (JSON["items"] as?NSArray)!但随后我在以下行中收到错误消息:无法使用类型为“(字符串)”的参数列表调用“值””videoObj.videoId =(video as AnyObject).value(“sn-p.resourceId .videoId") as! 字符串
  • 检查编辑后的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
相关资源
最近更新 更多