将协议类型变量分配和使用到类的成员

时间:2016-09-28 08:29:14

标签: ios swift interface delegates

我正在阅读一本好教程的代码,当我发现一些我不太了解的东西时(完整的代码在这里:https://www.ralfebert.de/tutorials/ios-swift-multipeer-connectivity/ConnectedColors.zip):

protocol ColorServiceManagerDelegate {

 func connectedDevicesChanged(_ manager : ColorServiceManager, connectedDevices: [String])
 func colorChanged(_ manager : ColorServiceManager, colorString: String)

}

class ColorServiceManager : NSObject {

 fileprivate let ColorServiceType = "example-color"
 fileprivate let myPeerId = MCPeerID(displayName: UIDevice.current.name)
 fileprivate let serviceAdvertiser : MCNearbyServiceAdvertiser
 fileprivate let serviceBrowser : MCNearbyServiceBrowser

 // THIS ONE!
 var delegate : ColorServiceManagerDelegate?

 override init() {

    self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: myPeerId, discoveryInfo: nil, serviceType: ColorServiceType)
    self.serviceBrowser = MCNearbyServiceBrowser(peer: myPeerId, serviceType: ColorServiceType)

    super.init()

    // AND THIS
    self.serviceAdvertiser.delegate = self
    self.serviceAdvertiser.startAdvertisingPeer()

    // AND THIS
    self.serviceBrowser.delegate = self
    self.serviceBrowser.startBrowsingForPeers()
    }

我不明白的是:

  1. 开发人员为什么声明此委托变量;
  2. 为什么它是可选的;
  3. 为什么是协议的类型;
  4. 为什么编译器不会抱怨serviceAdvertiser和serviceBrowser没有委托属性;
  5. 通过将此代表分配给自己来完成的任务;
  6. 仅举几例: - )

    感谢任何回答。

1 个答案:

答案 0 :(得分:2)

  1. 如果你熟悉java编程语言,ios中的委托和协议就像java中的接口一样用于回调。因此,协议包含一些方法,这些方法需要由确认该协议的所有类实现,并且委托变量用于从上述协议中调用这些方法。

  2. 委托变量通常是选项,因为可能存在没有对象确认协议且委托变量可能为零的情况。

  3. 委托用于从协议中调用方法,因此必须是协议的类型

  4. 如果swift中的所有非可选方法在调用super.init()之前在init中初始化,则编译器没有问题

  5. 通过将委托分配给self,对象声明它实现了ColorServiceManagerDelegate。

  6. 希望这有帮助。