电话中的额外争论?

时间:2017-08-20 20:38:06

标签: swift compiler-errors

我一直试图在整个星期内解决这个“额外的争论”标题。下面是我遇到问题的错误代码。我已经添加了我目前在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(){

2 个答案:

答案 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
}