Swift class 实例上的协议从不触发
Swift protocol on class instance never fires
我有一个 swift 协议,但它从未触发。
我有1个class是一个实例,另一个是class我想管理一个对象;
protocol TurnDelegate: class {
func turnIsCompleted()
}
class ClassOne : NSObject {
weak var delegate: TurnDelegate?
override init() {
super.init()
delegate?.turnIsCompleted()
}
}
class ClassTwo: NSObject, TurnDelegate {
static var instance = ClassTwo()
func turnIsCompleted() {
print ("Turn is completed")
}
}
let c2:ClassTwo = ClassTwo.instance
let c1:ClassOne = ClassOne.init()
我的问题是协议从不触发并且不输出 "turn is completed"
我该如何解决这个问题?
编辑:如何设置委托?
非常感谢
如果您描述了创建自定义 init
。
class ClassOne : NSObject {
weak var delegate: TurnDelegate?
init(with delegate: TurnDelegate?) {
self.delegate = delegate
delegate?.turnIsCompleted()
}
}
比:
let c2:ClassTwo = ClassTwo.instance
let c1:ClassOne = ClassOne.init(with: c2)
输出:
Turn is completed
代表在他们所有的荣耀中确实也有他们的缺点。其中之一是必须显式建立对象及其委托之间的关系。在 Cocoa 中,通常有两种方法可以做到这一点。一种是在 InterfaceBuilder 中连接 delegate
IBOutlet
,另一种是以编程方式进行的。正如@OlegGordiichuck 指出的那样,您可以在初始化程序中执行此操作,但通常在 Cocoa 中,委托往往是属性。在您的情况下,这将归结为实例化 ClassTwo
和 ClassOne
的对象,然后手动将 c2
的委托设置为
c2.delegate = c1
然而,这会破坏您的通知机制,您必须有一个单独的方法来通知委托人(这又是典型的,因为通常您的委托人不知道是重要的其他人在其构建过程中。此外,发起者的构建通常不是代表必须知道的事情)。
您忘记设置委托。
通常在init
方法中设置委托。协议中的方法稍后在另一个方法中调用例如
protocol TurnDelegate: class {
func turnIsCompleted()
}
class ClassOne : NSObject {
weak var delegate: TurnDelegate?
init(delegate: TurnDelegate?) {
self.delegate = delegate
}
func turnSomething()
{
delegate?.turnIsCompleted()
}
}
class ClassTwo: NSObject, TurnDelegate {
static let instance = ClassTwo()
func turnIsCompleted() {
print ("Turn is completed")
}
}
let c2 = ClassTwo.instance
let c1 = ClassOne(delegate: c2)
c1.turnSomething()
但是为此目的,尤其是与单例结合使用时,我更喜欢回调闭包而不是协议/委托。好处是开销更少,回调直接连接到调用方法。
class ClassOne : NSObject {
func turnSomething()
{
let c2 = ClassTwo.instance
c2.turn {
print ("Turn is completed")
}
}
}
class ClassTwo: NSObject {
static let instance = ClassTwo()
func turn(completion: ()->()) {
// do heavy work
completion()
}
}
let c1 = ClassOne()
c1.turnSomething()
我有一个 swift 协议,但它从未触发。
我有1个class是一个实例,另一个是class我想管理一个对象;
protocol TurnDelegate: class {
func turnIsCompleted()
}
class ClassOne : NSObject {
weak var delegate: TurnDelegate?
override init() {
super.init()
delegate?.turnIsCompleted()
}
}
class ClassTwo: NSObject, TurnDelegate {
static var instance = ClassTwo()
func turnIsCompleted() {
print ("Turn is completed")
}
}
let c2:ClassTwo = ClassTwo.instance
let c1:ClassOne = ClassOne.init()
我的问题是协议从不触发并且不输出 "turn is completed"
我该如何解决这个问题?
编辑:如何设置委托?
非常感谢
如果您描述了创建自定义 init
。
class ClassOne : NSObject {
weak var delegate: TurnDelegate?
init(with delegate: TurnDelegate?) {
self.delegate = delegate
delegate?.turnIsCompleted()
}
}
比:
let c2:ClassTwo = ClassTwo.instance
let c1:ClassOne = ClassOne.init(with: c2)
输出:
Turn is completed
代表在他们所有的荣耀中确实也有他们的缺点。其中之一是必须显式建立对象及其委托之间的关系。在 Cocoa 中,通常有两种方法可以做到这一点。一种是在 InterfaceBuilder 中连接 delegate
IBOutlet
,另一种是以编程方式进行的。正如@OlegGordiichuck 指出的那样,您可以在初始化程序中执行此操作,但通常在 Cocoa 中,委托往往是属性。在您的情况下,这将归结为实例化 ClassTwo
和 ClassOne
的对象,然后手动将 c2
的委托设置为
c2.delegate = c1
然而,这会破坏您的通知机制,您必须有一个单独的方法来通知委托人(这又是典型的,因为通常您的委托人不知道是重要的其他人在其构建过程中。此外,发起者的构建通常不是代表必须知道的事情)。
您忘记设置委托。
通常在init
方法中设置委托。协议中的方法稍后在另一个方法中调用例如
protocol TurnDelegate: class {
func turnIsCompleted()
}
class ClassOne : NSObject {
weak var delegate: TurnDelegate?
init(delegate: TurnDelegate?) {
self.delegate = delegate
}
func turnSomething()
{
delegate?.turnIsCompleted()
}
}
class ClassTwo: NSObject, TurnDelegate {
static let instance = ClassTwo()
func turnIsCompleted() {
print ("Turn is completed")
}
}
let c2 = ClassTwo.instance
let c1 = ClassOne(delegate: c2)
c1.turnSomething()
但是为此目的,尤其是与单例结合使用时,我更喜欢回调闭包而不是协议/委托。好处是开销更少,回调直接连接到调用方法。
class ClassOne : NSObject {
func turnSomething()
{
let c2 = ClassTwo.instance
c2.turn {
print ("Turn is completed")
}
}
}
class ClassTwo: NSObject {
static let instance = ClassTwo()
func turn(completion: ()->()) {
// do heavy work
completion()
}
}
let c1 = ClassOne()
c1.turnSomething()