【问题标题】:Delegate inside another class在另一个类中委托
【发布时间】:2015-12-08 17:10:21
【问题描述】:

我试图在另一个类中分配一个节点的委托,但它不起作用。

例子:

A类:

import SpriteKit

protocol ClassADelegate {

    func testA() -> Bool

}

class ClassA: SKSpriteNode {


} 

B类:

 import SpriteKit

    protocol ClassBDelegate {

        func testB() -> Bool

    }

    class ClassB: SKSpriteNode {

       let aux = ClassA()
       aux.delegate = self
    } 

所以我的问题是当我尝试初始化辅助委托时。我已经尝试过 aux.delegate = ClassADelegate 但这也不起作用。它说我不能将 ClassADelegate.protocol 类型的值分配给 ClassADelegate。

有什么解决办法吗?谢谢。

Ps.:这是一个非常简单的例子,我知道它不会产生任何结果。我的问题只是委托声明。

【问题讨论】:

    标签: swift delegates sprite-kit


    【解决方案1】:

    你有一大堆问题。

    首先,ClassA 没有名为 delegate 的属性。补充一点:

    class ClassA: SKSpriteNode {
        var delegate : ClassADelegate?
    }
    

    其次,您不能只是在课程中间随意抛出代码。它必须进入一个方法,所以将aux.delegate = self 移动到一个初始化器中:

    class ClassB: SKSpriteNode {
    
        let aux = ClassA()
    
        override init(texture: SKTexture!, color: UIColor!, size: CGSize) {
            super.init(texture: texture, color: color, size: size)
            aux.delegate = self
        }
    }
    

    第三,ClassB不符合ClassADelegate。声明它确实:

    class ClassB: SKSpriteNode, ClassADelegate {
    

    第四,ClassB没有实现ClassADelegate所要求的方法,本例为TestA()。所以补充一下:

    func testA() -> Bool {
        return true
    }
    

    最后,将所需的初始化器添加到ClassB

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    

    这是最终的代码:

    protocol ClassADelegate {
    
        func testA() -> Bool
    
    }
    
    class ClassA: SKSpriteNode {
        var delegate : ClassADelegate?
    }
    
    protocol ClassBDelegate {
    
        func testB() -> Bool
    
    }
    
    class ClassB: SKSpriteNode, ClassADelegate {
    
        let aux = ClassA()
    
        override init(texture: SKTexture!, color: UIColor!, size: CGSize) {
            super.init(texture: texture, color: color, size: size)
            aux.delegate = self
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func testA() -> Bool {
            return true
        }
    }
    

    【讨论】:

    • 对不起,我试图使代码尽可能简单,但我想我做错了。哈哈谢谢 =)
    • 但是我仍然有一个疑问,如果我不想在 B 类中使用 testA 函数,而是想在另一个类中使用该函数,这可能吗?就像我想在场景中调用 funcA 而不是 B 类一样。
    • 当然……只要让你的场景也符合ClassADelegate
    • 但问题是我的 ClassA 将要求我实现我的 testA,即使我不想这样做,因为我只想创建我的节点,而不是实现他的所有功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多