2017-08-20 58 views
0

我一直試圖解決這個「額外的爭論」標題'在通話中'整個星期。以下是我遇到的錯誤代碼。我已經添加了我目前在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! 
     } 
    } 
} 

OLD CODE

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(){ 
+1

如果'postStruct'實際上是一個名字所暗示的Struct,那麼您應該將其大寫爲'PostStruct';這是一個Swift慣例,所以遵循它使每個人都更清楚。 'PostStruct'是否有一個'''同時擁有'title'和'message'的init? – Connor

+0

Post結構只是結構的名稱&否它沒有init。 @Connor – LaniMJ

+0

使用自動完成功能將postStruct插入到數組中。如果它不起作用,請嘗試postStruct.init,它應該自動完成參數並滿足編譯器和您自己。 –

回答

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) 

你可能有一些其他故障在你的代碼,但至少你需要上面的修復。試試看。

+0

我添加了替換「self.posts.insert(PostStruct(title:title ??」,message:message ??「」),在:0)「但現在我收到錯誤「傳遞給調用的參數不帶任何參數」 – LaniMJ

+0

您是否替換了'PostStruct'的定義? – OOPer

+0

我真的很感謝幫助,我是ne在Xcode和我知道我可能聽起來像一個喋喋不休的白癡! @OOPer – LaniMJ

0

您的PostStruct結構對於title屬性具有默認值。自動生成的初始化程序將僅包含尚未具有缺省值的參數,這就是自動初始化程序將message作爲參數而不是title的原因。此外,title的默認值是String類型本身,而不是字符串的實例,我懷疑是您想要的。我也懷疑PostStruct的屬性真的需要隱式展開的選項。

聲明這樣的結構,你的初始化應該工作:

struct PostStruct { 
    let title: String 
    let message: String 
}