-2

I have a simple class in Swift 4 like this:

class Message {

    var messageBody : String = ""
    var sender : String = ""

}

And I want to (in one line) populate a variable with an instance of this object.

I tried to do it like this:

func retrieveMessages() {
    let messageDB = Database.database().reference().child("Messages")
    messageDB.observe(.childAdded) { (snapshot) in
        let snapshotValue = snapshot.value as! Dictionary<String,String>
        let text = snapshotValue["MessageBody"]!
        let sender = snapshotValue["Sender"]!
        let message = Message(messageBody: text, sender: sender) // relevant one liner
    }
}

But this does not work. What am I doing wrong?

Also note, that this:

let message = Message()
message.messageBody = text
message.sender = sender

works.

J. Hesters
  • 13,117
  • 31
  • 133
  • 249

1 Answers1

2

Just use a struct which provides a free memberwise initializer

struct Message {   

    var messageBody : String 
    var sender : String
}

Or in case of a class write one

class Message {

    var messageBody : String 
    var sender : String

    init(messageBody : String, sender : String) {
       self.messageBody = messageBody
       self.sender = sender
    }
}

In both cases there is no need to assign default values.

For further information please read Swift Language Guide : Initialization

vadian
  • 274,689
  • 30
  • 353
  • 361
  • 1
    I would also declare the properties as constants. If OP needs to change it just create a new object. – Leo Dabus Aug 17 '18 at 11:50
  • import Foundation class Message { var messageBody : String = "" var sender : String = "" init(msgBody : String = "MessageBody" , senderText : String = "sender text" ) { messageBody = msgBody sender = senderText } } let msg = Message(msgBody: "Hello", senderText: "Mike") let messge = Message() // default parameters gets printed. //Are you looking for default parameter ? – Dipesh Pokhrel Aug 17 '18 at 13:36
  • Thank you, now I understand what was missing :) – J. Hesters Aug 18 '18 at 23:01