【问题标题】:How to use a variable retrieved by a delegate in a different method within the same class it was declared如何在声明的同一类中的不同方法中使用委托检索的变量
【发布时间】:2018-09-17 10:11:39
【问题描述】:

我有两个班级,A 和 B: 在 A 类中,我有一个变量,每次满足某个条件时,它的值就会增加一。在 B 类中,我希望能够访问我通过实现委托管理的变量中的值(通过实现断点,我可以看到“valueRetrieved”持有正确的值)。

我的问题是如何使用 valueRetrieved 并将其作为 int 返回。我尝试创建一个不同的方法并调用 valueRetrieved 但我只得到 0 作为值。原因是因为我希望将该值链接到我的 ViewController 中的 UILabel。任何帮助将不胜感激,如果这是错误的方法,请告诉我。

protocol valueDelegate: class {
    func retrieveValue -> Int    
}

class B {
    var valueRetrieved = 0
    var valueToIncrement = 0
    weak var delegate: valueDelegate?

    func callToValueRetrieved() {
        valueRetrieved = (self.delegate?.retrieveValue())!
        if valueRetrieved == 6{
            valueToIncrement += 1
        }

    func toUseValueIncremented -> Int{
        //would want to return the final valueToIncrement as a int here
return""
    }

A类

class A: valueDelegate{
    func retrieveValue() -> Int {
        return valueToDelegate
    } 
}

var valueToDelegate:Int = 0
var bClass: B = B()

func ready() -> Bool {
    if //condition{
        valueToDelegate += 1
        bClass.delegate = self
        bClass.callToValueRetrieved()
        return true
    }

【问题讨论】:

    标签: swift delegation


    【解决方案1】:

    使用下面的变量代替以retrieveValue() 作为函数的协议

    protocol valueDelegate: class { var valueToDelegate: Int { get } }

    因此,您可以轻松访问 self.delegate.valueToDelegate 变量,甚至可以更新它。

    【讨论】:

    • 如何将 valueToDelegate 链接到 valueRetrieved?因为在 A 类中我有返回调用,我需要将其更改为 var retrieveValue:Int
    • 轻微更新,我想通了,只是等于 valueToDelegate 的值。非常感谢!
    【解决方案2】:

    我会反其道而行之

    protocol ValueDelegate: class {
        func didSetValue(value: Int)
    }
    
    class A {
    
        var valueToBeSent = 0
        weak var delegate: ValueDelegate?
    
        func ready() -> Bool {
            if true {
                valueToBeSent += 1
                delegate?.didSetValue(value: valueToBeSent)
                return true
            }
        }
    }
    
    class B: ValueDelegate {
    
        var valueToIncrement = 0
    
        func didSetValue(value: Int) {
            valueToIncrement = value
            print("value has changed: \(value)")
        }
    
        var myInstanceOfA = A()
    
        init() {
            myInstanceOfA.delegate = self
        }
    
        func testThatValueIsReturned() {
            // use the returned Bool as you intend to
            _ = myInstanceOfA.ready()
        }
    }
    
    var myInstanceOfB = B()
    
    myInstanceOfB.testThatValueIsReturned() // value has changed: 1
    
    myInstanceOfB.testThatValueIsReturned() // value has changed: 2
    

    【讨论】:

    • 我已经在一个单独的文件中尝试过这种方法并且效果很好!谢谢@Giorgio R.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多