2016-01-18 45 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可以安全地浇铸为雨燕字典。与斯威夫特的数据类型的工作给予你更灵活,可以帮助你编写更少,更强大的代码。

相关问题