Stephen Fox
Stephen Fox

Reputation: 14470

Sharing data between classes via delegates in Swift, iOS

I am trying to get to know how delegates work a bit better in Swift, and in general. In the example I have created I have a Sender class and a Receiver class. I want to send a message from Sender to Receiver

I then want to create a variable instance of the Receiver class and print the message that the Sender sent to it. However I am having difficulty as when I call the function ShareMessage(message: NSString) from the variable instance I have created var recieveMessage I have to type in another message or string and I cannot retrieve the message that the Sender class sent to it.

Here is the code I am working with. I am not sure if what I am asking is correct, however I am just curious as how I go about retrieving the data in the variable instance.

import UIKit

// Protocol to send message between classes.
protocol SendersMessageDelegate{

    func shareMessage(message: NSString)
}

// Class that sends the message
class Sender{

    // Create variable to hold message
    var sendersMessage: NSString = NSString()

    var delegate: SendersMessageDelegate? = Receiver()

    // Grab the message when initialized and send to delegate
    init(sendersMessage: NSString){

        self.sendersMessage = sendersMessage
        delegate?.shareMessage(sendersMessage)
    }          

}

//Class receiving the message
class Receiver: SendersMessageDelegate{

    func shareMessage(message: NSString) {

        println(message)

    }
}

//Create variable instance of sender and send message in initializer.
var sendMessage: Sender = Sender(sendersMessage: "Hello Receiver.")

var receiveMessage: Receiver = Receiver()
receiveMessage.shareMessage(message: NSString) <---- //Can't retrieve message as need new argument for function call.

This is the bit I have trouble retrieving the message or data as I have to pass a new argument.

receiveMessage.shareMessage(message: NSString)

Upvotes: 2

Views: 3215

Answers (1)

pbevis
pbevis

Reputation: 198

I think you have your logic mixed up a bit.

Your Sender is set up to create a Receiver by itself and then instantly send out a message to it on creation.

So when in this line:

var sendMessage: Sender = Sender(sendersMessage: "Hello Receiver.")

You've already done what you're trying to do in the next two lines. If you want to then have this receiver STORE the message and for you to retrieve later on, then you need your Receiver class to save this as a variable as well as print it out.

class Receiver: SendersMessageDelegate{

    var savedMessage:NSString?

    func shareMessage(message: NSString) {
        savedMessage = message
        println(message)
    }
}

Which you can then access by doing the following:

var sharedMessage = receiver.savedMessage

The second issue that you have however is that because you've created the Receiver INSIDE your Sender you'll need to pull the receiver from it.

var sender: Sender = Sender(sendersMessage: "Hello Receiver.")
var receiver:Receiver = sender.delegate
var sharedMessage = receiver.savedMessage

Which is quite a strange thing to do. The usual pattern would be to create a Receiver and give it to the Sender. Then call a function in the Sender that would trigger a message being sent to the Receiver. Like so:

import UIKit

// Protocol to send message between classes.
protocol SendersMessageDelegate{
    func shareMessage(message: NSString)
}

// Class that sends the message
class Sender{

    // Create variable to hold message
    var sendersMessage: NSString = NSString()

    var delegate: SendersMessageDelegate?

    // Save the message that it needs to send
    init(sendersMessage: NSString){
        self.sendersMessage = sendersMessage
    }

    // If it has as a delegate, then share the message with it.
    func sendMessage() {
        delegate?.shareMessage(sendersMessage)
    }
}

//Class receiving the message
class Receiver: SendersMessageDelegate{

    var savedMessage:NSString?

    func shareMessage(message: NSString) {
        savedMessage = message
        println(message)
    }
}

//Create Sender and Receiver
var sender: Sender = Sender(sendersMessage: "Hello Receiver.")
var receiver: Receiver = Receiver()

//give Sender it's Receiver
sender.delegate = receiver

//Trigger the sender to send message to it's Receiver
sender.sendMessage()

Upvotes: 6

Related Questions