我一直试图在整个星期内解决这个“额外的争论”标题。下面是我遇到问题的错误代码。我已经添加了我目前在Xcode中使用的新代码。我用这段代码得到的错误是:
“有人打电话给没有任何争议的人”
新代码
import UIKit
import Firebase
import FirebaseDatabase
struct PostStruct {
struct PostStruct {
let title: String
let message : String
}
}
class DatabaseViewController: UITableViewController {
var posts: [PostStruct] = []
override func viewDidLoad() {
super.viewDidLoad()
//
let databaseRef = Database.database().reference()
databaseRef.child("Posts").queryOrderedByKey().observe(.childAdded, with: {
snapshot in
let snapshotValue = snapshot.value as? NSDictionary
let title = snapshotValue?["title"] as? String
let message = snapshotValue?["message"] as? String
self.posts.insert(PostStruct(title: title ?? "", message: message ?? ""), at: 0) **// <-- ARGUMENT PASSED TO CALL THAT TAKES NO ARGUMENTS**
self.tableView.reloadData()
})
post()
}
func post(){
let title = "Title"
let message = "Message"
let post : [String : AnyObject] = ["title" : title as AnyObject, "message" : message as AnyObject]
let databaseRef = Database.database().reference()
databaseRef.child("Posts").childByAutoId().setValue(post)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
cell?.textLabel?.text = "New value"
cell?.detailTextLabel?.text = "New value"
return cell!
} else {
cell?.textLabel?.text = "" //reset value
cell?.detailTextLabel?.text = "" // resetValue
cell?.textLabel?.text = "New value"
cell?.detailTextLabel?.text = "New value"
return cell!
}
}
}
旧代码
import UIKit
import Firebase
import FirebaseDatabase
struct PostStruct {
let title = String!.self
let message : String!
}
class DatabaseViewController: UITableViewController {
var posts = [postStruct]()
override func viewDidLoad() {
super.viewDidLoad()
//
let databaseRef = Database.database().reference()
databaseRef.child("Posts").queryOrderedByKey().observe(.childAdded, with: {
snapshot in
let snapshotValue = snapshot.value as? NSDictionary
let title = snapshotValue?["title"] as? String
let message = snapshotValue?["message"] as? String
self.posts.insert(PostStruct(title: title ,message: message), at: 0) // **<-- EXTRA ARGUMENT 'title' IN CALL**
self.tableView.reloadData()
})
post()
}
func post(){
答案 0 :(得分:1)
您的代码有两个严重缺陷:
PostStruct
的定义应该是这样的:
struct PostStruct {
let title: String
let message : String
}
第let title = String!.self
行声明您的title
有一个类对象,而不是String
。
另一个是行DatabaseViewController
:
var posts = [post]
在您的代码中,post
是一种方法,我相信您不需要一组方法。
这应该是这样的:
var posts: [PostStruct] = []
要使上面的两个修复工作,你还需要更多:
self.posts.insert(PostStruct(title: title ?? "", message: message ?? ""), at: 0)
您的代码中可能还有其他一些错误,但至少您需要上面的修复程序。试试吧。
答案 1 :(得分:0)
您的PostStruct
结构具有title
属性的默认值。自动生成的初始化程序将仅包含尚未具有默认值的参数,这就是自动初始化程序将message
作为参数而不是title
的原因。此外,title
的默认值是String
类型本身,而不是字符串的实例,我怀疑这是你想要的。我也怀疑PostStruct
的属性确实需要隐式解包的选项。
声明这样的结构,你的初始化器应该可以工作:
struct PostStruct {
let title: String
let message: String
}