【问题标题】:Swift protocol property set not executedSwift 协议属性集未执行
【发布时间】:2016-07-20 19:04:22
【问题描述】:

我尝试在值改变后使用set方法调用函数。

我不明白为什么不调用 set 方法。

代码可以直接在操场上执行

//: Playground - noun: a place where people can play

import UIKit

protocol RandomItem {
    var range : (Int,Int) {get set}
    var result : Int {get set}

    init()
    mutating func createRandom()
}

extension RandomItem {
    var range : (Int,Int) {
        get {
            return range
        }
        set {
            range = newValue
            self.createRandom()
        }
    }
}

struct Item: RandomItem {
    var range =  (0,1)
    var result: Int = 0

    init() {
        self.createRandom()
    }

    mutating func createRandom() {
        let low = UInt32(range.0)
        let high = UInt32(range.1)
        result = Int(arc4random_uniform(high - low + 1) + low)
    }
}

【问题讨论】:

  • 扩展访问器都执行无限递归调用。这似乎是假的。

标签: swift swift-protocols


【解决方案1】:

你的结构Item 声明了它自己的range 属性,它覆盖了你在协议扩展中创建的默认值。 Item 中的 range 属性没有定义 getter 或 setter 来执行您的扩展版本所做的事情。

另一个问题:

您的协议扩展将range 属性定义为计算属性(无存储),其getter 和setter 都调用自身。这将无限循环。

也许您正在寻找类似的东西:

protocol RandomItem {
    var storedRange: (Int, Int) { get }
    var range : (Int,Int) {get set}
    var result : Int {get set}

    init()
    mutating func createRandom()
}

extension RandomItem {
    var range : (Int,Int) {
        get {
            return storedRange
        }
        set {
            storedRange = newValue
            self.createRandom()
        }
    }
}

struct Item: RandomItem {
    var result: Int = 0
    var storedRange = (0, 1)

    init() {
        self.createRandom()
    }

    mutating func createRandom() {
        let low = UInt32(range.0)
        let high = UInt32(range.1)
        result = Int(arc4random_uniform(high - low + 1) + low)
    }
}

这需要符合类型来定义存储属性storedRange,计算属性range 的默认实现将与之交互。

【讨论】:

  • 项目确实有(自动生成的)访问器,这些访问器会覆盖从协议继承的访问器。
  • 我不得不使用 set 选项扩展 storedRange 变量,但随后我按预期工作。谢谢
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多