2016-01-18 83 views
-1

當我嘗試通過使用外部數據庫與我的應用程序上的API連接數據庫時,出現loadPostsfunction錯誤。我該如何解決這個錯誤「AnyObject?不能轉換爲'字符串'」?

錯誤:

AnyObject is not convertible to String

代碼:

import UIKit 
class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     service = PostService() 
     service.getPosts(){ 
      (response) in 
      self.loadPosts(response["posts"]! as! NSArray) 
     } 
    } 
    /////////////////// In here /////////////////////// 
    func loadPosts(posts:NSArray) { 
     for post in posts { 
      var id = (post["Post"]!["id"]! as! String).toInt()! 
      var title = post["Post"]!["title"]! as String 
      var author = post["Post"]!["author"]! as String 
      var content = post["Post"]!["content"]! as String 
     } 
    } 
    //////////////////////////////////////////////////// 
    //Link DB 
    var postsCollection = [Post]() 

    var service:PostService! 

} 

任何想法嗎?

+0

歡迎來到StackOverflow!如果你能提供更多的細節,你的問題可能會更容易分析:你會得到哪條線錯誤? 'response [「posts」]'包含什麼樣的數據,我認爲它是一個'NSDictionary'數組,這是正確的嗎?你能用這些細節更新你的問題,謝謝? – Cristik

回答

0

AnyObject不能轉換爲字符串。

你應該讓它知道post [「Post」]是NSDictionary或你定義它的類型。

func loadPosts(posts:NSArray) { 
    for post in posts { 
     var id = ((post["Post"]! as? NSDictionary)!["id"]! as! String).toInt()! 
     var title = (post["Post"]! as? NSDictionary)!["title"]! as String 
     var author = (post["Post"]! as? NSDictionary)!["author"]! as String 
     var content = (post["Post"]! as? NSDictionary)!["content"]! as String 
    } 
} 
+0

如果4個鍵中的任何一個丟失,或者相應的值不是'String',這將保證崩潰。 – Cristik

+0

邑,使用它!代替 ?。 –

0

有多個問題與您的代碼,我會盡量教你如何做的更好,讓您不再收到編譯錯誤,而且你最好處理各種故障點。第一

第一件事,讓我們Swiftify你的代碼,並利用系統類型:

self.loadPosts(response["posts"]! as! NSArray) 

可以更好地寫成

​​

,該optional binding可讓您處理的情形,其中服務器發送無效響應。

其次,讓我們指定loadPosts接受字典的數組(確切地我們在上面鑄造類型):

func loadPosts(posts: [[String:AnyObject]]) 

而且不是最後,所有的強制解開(!)可以讓你的應用程序崩潰,而不思考兩次。問題是你無法控制服務器發送哪些數據 - 如果你盲目信任它的數據,服務器中的錯誤會導致你的應用程序崩潰,所以你需要添加安全措施以避免由於無效數據導致的應用程序崩潰:

func loadPosts(posts: [[String:AnyObject]]) { 
    for post in posts { 
     guard let postDetail = post["Post"] as? [String:AnyObject], 
      id = postDetail["id"] as? String, 
      title = postDetail["title"] as? String, 
      author = postDetail["author"] as? String, 
      content = postDetail["content"] as? String else { 
      continue 
     } 
     // I assume here you would construct a Post object 
    } 
} 

記住NSArray可以安全地施法者的斯威夫特陣列(例如,[字符串],或在您的案件[[String:AnyObject]],同樣一個NSDictionary可以安全地澆鑄爲雨燕字典。與斯威夫特的數據類型的工作給予你更靈活,可以幫助你編寫更少,更強大的代碼。

相關問題