通过Swift,iOS中的代理在类之间共享数据

Ste*_*Fox 2 delegates ios swift

我试图了解代理如何在Swift中更好地工作,总的来说.在我创建的示例中,我有一个Sender类和一个Receiver类.我想发送一条消息SenderReceiver

然后我想创建一个Receiver类的变量实例并打印Sender发送给它的消息.但是我遇到了困难,因为当我ShareMessage(message: NSString)从我创建的变量实例调用函数时,var recieveMessage我必须输入另一个消息或字符串,我无法检索Sender类发送给它的消息.

这是我正在使用的代码.我不确定我问的是否正确,但我只是好奇我如何检索变量实例中的数据.

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.
Run Code Online (Sandbox Code Playgroud)

这是我在检索message数据时遇到的问题,因为我必须传递一个新的参数.

receiveMessage.shareMessage(message: NSString)
Run Code Online (Sandbox Code Playgroud)

pbe*_*vis 6

我认为你的逻辑有点混乱了.

您的发件人已设置为自行创建接收器,然后在创建时立即向其发送消息.

所以当在这一行:

var sendMessage: Sender = Sender(sendersMessage: "Hello Receiver.")
Run Code Online (Sandbox Code Playgroud)

你已经完成了接下来两行中你想要做的事情.如果你想让这个接收器存储消息并让你以后检索,那么你需要你的Receiver类将它保存为变量并打印出来.

class Receiver: SendersMessageDelegate{

    var savedMessage:NSString?

    func shareMessage(message: NSString) {
        savedMessage = message
        println(message)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过执行以下操作访问该文件:

var sharedMessage = receiver.savedMessage
Run Code Online (Sandbox Code Playgroud)

然而,您遇到的第二个问题是,因为您已经创建了发件人INSIDE,您需要从中接收接收器.

var sender: Sender = Sender(sendersMessage: "Hello Receiver.")
var receiver:Receiver = sender.delegate
var sharedMessage = receiver.savedMessage
Run Code Online (Sandbox Code Playgroud)

这是一件非常奇怪的事情.通常的模式是创建一个Receiver并将其提供给Sender.然后调用发件人中的一个函数,该函数将触发发送给Receiver的消息.像这样:

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()
Run Code Online (Sandbox Code Playgroud)