当我尝试使用外部数据库和我的应用程序上的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!
}
有什么想法吗?
答案 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的数据类型可以提供更大的灵活性,并可以帮助您编写更少,更强大的代码。