gpt4 book ai didi

ios - 通过对象委托(delegate)强制 'pass-by-value'

转载 作者:行者123 更新时间:2023-11-28 08:22:12 25 4
gpt4 key购买 nike

我创建了一个名为“RotaryWheel”的自定义 UIControl 子类。它是一个响应手势的选择轮。

滚轮上的每个选择都由以下内容表示。

struct RotaryWheelSectorExternal {

let section: Int
let title: String
var item: Any?

init(section: Int, title: String, item: Any? = nil) {
self.section = section
self.title = title
self.item = item
}
}

以上为公共(public)API,消费时,内部表示为。

struct RotaryWheelSectorInternal {

let sector: Int
let minValue: Double
let midValue: Double
let maxValue: Double
let angle: Double
let title: String
var item: Any?

}

注意上面的两个结构如何包含相同的信息,但是一个比另一个更冗长。

旋转轮代理忠于此设计,仅报告外部表示。

protocol RotaryWheelControlDelegate: class {
func rotationEnded(onSector sector: RotaryWheelSectorExternal)
}

当然,这需要在实例化滚轮时转换为外部 > 内部,并在用户进行选择并且滚轮控件向其委托(delegate)报告选择时转换为内部 > 外部。

这对我来说感觉不对,但我编写 Swift 的时间已经足够长,我知道以下内容也不对。

class RotaryWheelSector {

let sector: Int
var minValue: Double?
var midValue: Double?
var maxValue: Double?
var angle: Double?
let title: String
var item: Any?

init...

}

这是我考虑过的另一种选择。

class RotaryWheelSectorExternal {

let section: Int
let title: String
var item: Any?

init(section: Int, title: String, item: Any? = nil) {
self.section = section
self.title = title
self.item = item
}
}

class RotaryWheelSectorInternal: RotaryWheelSectorExternal {

let minValue: Double
let midValue: Double
let maxValue: Double
let angle: Double

init(section: Int, title: String, item: Any?, min: Double, mid: Double, max: Double, angle: Double) {
self.minValue = min
self.midValue = mid
self.maxValue = max
self.angle = angle
super.init(section: section, title: title, item: item)
}

convenience init(sector: RotaryWheelSectorExternal, min: Double, mid: Double, max: Double, angle: Double) {
self.init(section: sector.section, title: sector.title, item: sector.item, min: min, mid: mid, max: max, angle: angle)
}

}

但是,这也感觉不对,我不确定该采用哪种方法。

如有任何想法,我们将不胜感激。

最佳答案

我建议为外部表示创建一个协议(protocol),让委托(delegate)处理该协议(protocol)的一个实例,并使内部表示结构符合外部表示协议(protocol)。这允许您在任何地方使用相同的结构实例(不需要转换),同时仍然不向委托(delegate)公开内部属性。

例子:

fileprivate struct RotaryWheelSectorInternal {

let sector: Int
let minValue: Double
let midValue: Double
let maxValue: Double
let angle: Double
let title: String
var item: Any?

}

protocol RotaryWheelSectorData {

let section: Int
let title: String
var item: Any?

}

protocol RotaryWheelControlDelegate: class {
func rotationEnded(onSector sector: RotaryWheelSectorData)
}

extension RotaryWheelSectionInternal : RotaryWheelSectorData { }

在此示例中,实际的 RotaryWheelSectoryInternal 类型甚至对其他类不可见,但 RotaryWheelSectoryData 协议(protocol)会。因此,您可以将 RotaryWheelSectoryInternal 的实例作为 RotaryWheelSectoryData 的实例传递给外部委托(delegate),从而仅公开该结构的那些属性。

关于ios - 通过对象委托(delegate)强制 'pass-by-value',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40959428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com