【问题标题】:Protocol declaration in Swift - Xcode 6 beta 5Swift 中的协议声明 - Xcode 6 beta 5
【发布时间】:2014-10-15 11:04:51
【问题描述】:

使用 Xcode 6 beta 5 协议和委托不能像第一个那样工作。 printCar() 在调用 self.delegate?.printCar() 时不会被调用。我现在如何使用协议和委托?

import UIKit

protocol communication{
    func printCar()
}

class car{
    var delegate:communication?

    init(){}

    func passCar(){
        self.delegate?.printCar()
    }
}

class ViewController: UIViewController,communication {

    override func viewDidLoad() {
        super.viewDidLoad()
        println("start")
        var bmw = car()
        bmw.passCar()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func printCar(){
        println("car")
    }
}

【问题讨论】:

  • 当调用init() 时,self.delegatenil。 - (事实上,您没有将委托设置为视图控制器类。)
  • 我写了一个不好的例子,我尝试重写它
  • 我的最后一句话仍然适用(也在下面的答案中):您没有分配代表(例如bmw.delegate = self)。
  • 现在可以使用了。谢谢。

标签: ios swift xcode6-beta5


【解决方案1】:

您没有设置汽车的delegate 属性,因此没有对象可以调用printCar()

此外,在 Swift 中使用首字母大写作为类型名称的惯例。 (你会注意到它是如此强大的约定,甚至 SO 的语法荧光笔都期望它。)

顺便说一句,这与此问题无关,但您现在可能希望使用 Xcode 6 beta 6。

另一个不相关的问题:您的汽车类的delegate 属性可能应该标记为weak。否则,如果汽车的委托是拥有汽车的对象,则会发生内存泄漏。

【讨论】:

  • 在调用bmw.passCar() 之前,您需要为bmwdelegate 属性分配一些内容。否则该方法中的self.delegate?.printCar() 调用将不会执行,因为self.delegate? 解析为nil
猜你喜欢
  • 2015-11-16
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多