Swift 协议 属性 设置未执行
Swift protocol property set not executed
我尝试使用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
属性,它覆盖了您在协议扩展中创建的默认值。 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方法在值改变后调用函数
我没明白为什么不调用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
属性,它覆盖了您在协议扩展中创建的默认值。 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
的默认实现将与之交互。