Swift协议属性集未执行

时间:2016-07-20 19:04:23

标签: swift swift-protocols

我尝试在更改值后使用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)
    }
}

1 个答案:

答案 0 :(得分:0)

您的struct Item声明自己的range属性,该属性会覆盖您在协议扩展中创建的默认值。 range中的Item属性没有定义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的默认实现将与之相互作用。