2017-08-20 3 views
0

Ich habe versucht, diese "EXTRA ARGUMENT" Titel "IN CALL" die ganze Woche zu lösen. Unten ist der Code mit dem Fehler, mit dem ich Probleme habe. Ich habe den neuen Code, mit dem ich gerade arbeite, in Xcode hinzugefügt. Der Fehler ich mit diesem Code bekommen ist:Zusätzliches Argument im Anruf?

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 "Argument, ohne Argumente ANRUFEN PASSED" NEW 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

Wenn 'postStruct' eigentlich ein Struct ist wie sein Name, dann sollten Sie es als' PostStruct'; Das ist eine Swift Convention, also macht es die Sache klarer für alle. Hat 'PostStruct' eine' init', die sowohl 'title' als auch' message' enthält? – Connor

+0

Post-Struktur ist nur der Name der Struktur & nein, es hat keine Init. @Connor – LaniMJ

+0

Verwenden Sie die Autokomplettierungsfunktion, um das postStruct in das Array einzufügen. Wenn es nicht funktioniert, versuchen Sie es mit postStruct.init, und das sollte die Argumente automatisch vervollständigen und den Compiler und sich selbst befriedigen. –

Antwort

1

Ihr Code hat zwei kritische Fehler:

Die Definition von PostStruct sollte wie folgt sein:

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

Die Zeile let title = String!.self deklariert Ihre title mit einem Klassenobjekt, nicht String.

Und ein anderer ist die Linie DatabaseViewController:

var posts = [post] 

in Ihrem Code post eine Methode ist, glaube ich Sie nicht über ein Array von Methoden wollen.

var posts: [PostStruct] = [] 

Und damit zwei Korrekturen oben zu arbeiten, müssen Sie ein wenig mehr:

 self.posts.insert(PostStruct(title: title ?? "", message: message ?? ""), at: 0) 

Sie haben einige andere Fehler im Code,

die so etwas wie dies sein sollte, aber zumindest brauchst du die obigen Fixes. Versuch sie.

+0

Ich habe den Ersatz "self.posts.insert (PostStruct (Titel: Titel ??" ", Nachricht: Nachricht ??" "), bei: 0)" aber jetzt bekomme ich den Fehler "Argument übergeben zu rufen, das keine Argumente annimmt" – LaniMJ

+0

Haben Sie die Definition von 'PostStruct' wie gezeigt ersetzt? – OOPer

+0

Ich schätze wirklich die Hilfe, ich bin ne w bei Xcode und ich weiß, dass ich wahrscheinlich wie ein lallender Idiot klingen werde! @OOPer – LaniMJ

0

Ihre Struktur PostStruct hat einen Standardwert für die Eigenschaft title. Der automatisch generierte Initialisierer enthält nur Parameter für Werte, die noch keinen Standardwert haben. Deshalb hat der automatische Initialisierer message als Parameter und nicht title. Außerdem ist Ihr Standardwert für title der Typ String selbst, und nicht eine Instanz einer Zeichenfolge, die ich bezweifle, was Sie wollen. Ich bezweifle auch, dass die Eigenschaften von PostStruct wirklich implizit-unwrapped Optionals sein müssen.

Deklarieren Sie die Struktur so, und Ihre initializer sollte funktionieren:

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