2016-09-15 27 views
30

Ứng dụng của tôi được yêu cầu đến một vị trí cụ thể để kéo xuống trang web cần tải. Trong 2,3 nó làm việc như một say mê, nhưng kể từ khi tôi đã cập nhật xcode (mà tôi không có một tấn kinh nghiệm trong) nó là cho tôi lỗi "loại 'Bất kỳ' không có thành viên subscript" và làm nổi bật "json" ngay trước dòng ba sốNhập 'Bất kỳ' Không có Thành viên Subscript nào trong xcode 8 Swift 3

...Retriever = json["WEB"]... 

đây là mã liên quan đến nó.

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) 

     if let Retriever = json["WEB"] as? [[String: AnyObject]] { 

       for website in Retriever { 

        if let name = website["URL"] as? String { 

          self.loadAddressURL(name) 

Tôi cảm thấy mình thiếu cái gì đó nhỏ. Nếu có một cách tốt hơn để làm điều này, tôi sẽ yêu các đề xuất. URL trả về JSON

{ 
    "WEB" : [ 
      { 
      "URL" : "http://www.google.com" 
      }  
      ] 
} 

này nhưng tôi rất thích nó nếu tôi có thể đơn giản hóa nó để chỉ

{"URL":"http://www.google.com"} 

Trả lời

57

Hãy thử điều này:

let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [String:AnyObject] 

cách an toàn:

do { 
    if let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as? [String:Any] { 
     print(json) 
    } 
} catch let err{ 
    print(err.localizedDescription) 
} 

Bạn phải nhập loại Any vào loại từ điển Swift [String:AnyObject].

Edit: Swift 3
Trong nhanh chóng 3 mục đích AnyObject được làm rõ hơn. Loại Swift Dictionary thuận lợi hơn sẽ là [String:Any].

Any là bí danh cho bất kỳ loại dữ liệu nào.
AnyObject là bí danh cho bất kỳ loại dữ liệu nào được lấy từ một lớp.

Để biết thêm thông tin xin truy cập: https://craiggrummitt.com/2016/09/16/any-vs-anyobject-vs-nsobject-in-swift-3/

+0

Làm việc như một nét duyên dáng, tôi đã có thêm "!" sau khi như nhưng nó làm việc như một nét duyên dáng – DaVinci1223

+0

Cảm ơn rất nhiều: * Bạn đã tiết kiệm cho tôi giờ headscratching –

+2

Nó sẽ là tốt nếu ai đó có thể thêm thông tin có giá trị tương đối hơn cho câu trả lời này vì nó đang trở nên phổ biến. :) –

Các vấn đề liên quan