Swift 协议(protocol)属性集未执行

标签 swift swift-protocols

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

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

代码可以直接在playground中执行

//: 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)
    }
}

最佳答案

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

另一个问题:

您的协议(protocol)扩展将 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 的默认实现将与之交互。

关于Swift 协议(protocol)属性集未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38488847/

相关文章:

swift - 在 Swift 中计算与 Int 的时间差

swift - 你如何命名 Swift 协议(protocol)中的函数?

ios - 弹出过渡动画

swift - 非'@objc'方法不满足'@objc'协议(protocol)的可选要求

swift - 为什么 "UInt64(1 << 63)"会崩溃?

xcode - 在 Swift 中将 UIColor 转换为十六进制(网络颜色)的最佳/最短方法是什么?

swift - 隐式设置关联类型

iOS Swift FIrebase : moving data to another firebase ref

ios - UICollectionView 在自定义键盘扩展中不起作用