如何修复此错误“AnyObject?不能转换为'string'”?

时间:2016-01-18 04:03:26

标签: ios swift

当我尝试使用外部数据库和我的应用程序上的API连接数据库时,我在loadPostsfunction中收到错误。

错误:

  

AnyObject不可转换为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!

}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

AnyObject不能转换为String。

你应该让它知道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
    }
}

答案 1 :(得分:0)

您的代码存在多个问题,我将尝试教您如何使其更好,以便您不再收到编译错误,并且您可以更好地处理各种故障点。

首先,让我们对您的代码进行Swiftify并使用类型系统:

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

可以更好地写成

if let postsDicts = response["posts"] as? [[String:AnyObject]] {
    loadPosts(postsDicts)
} else {
    // the server response didn't send the proper "posts"
}

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可以安全地转向Swift数组(例如[String],或者像{1}}一样,同样可以将[[String:AnyObject]]安全地转换为Swift字典。使用Swift的数据类型可以提供更大的灵活性,并可以帮助您编写更少,更强大的代码。