我正在内部(在公司)实现一个框架,其中应用程序应根据提供的类型运行。我计划将该类型实现为枚举。但是尝试自定义该功能的开发人员应该能够扩展该类型并能够向其添加更多选项。由于我们无法扩展枚举来添加更多案例,因此我一直在寻找替代方案。
您可以使用自定义
struct
作为可扩展标识符,而无需将其设为 OptionSet
,只需手动遵守 RawRepresentable
即可,如下所示。这还有一个有用的副作用,即用户无法传递值的数组,就好像它们是值本身的单个实例一样,如果您想要唯一性,这是不可取的。以下是我处理唯一标识符的方法:
public struct Identifier: RawRepresentable, Hashable {
public typealias RawValue = String
public let rawValue: RawValue
public init?(rawValue: RawValue) {
self.rawValue = rawValue
}
public var hashValue: Int {
return rawValue.hashValue
}
static let unknown = Identifier(rawValue: "Unknown")
}
完成此操作后,用户可以使用更多静态变量扩展结构,如下所示:
extension Identifier {
static let item1 = Identifier(rawValue: "Item 1")!
static let item2 = Identifier(rawValue: "Item 2")!
static let item3 = Identifier(rawValue: "Item 3")!
}
带有静态变量的协议怎么样
PreferenceKey
,LayoutValueKey
等
protocol LayoutValueKey {
static var defaultValue: Self.Value
associatedtype Value
}
使用方法如下:
private struct Flexibility: LayoutValueKey {
static let defaultValue: CGFloat? = nil
}
https://developer.apple.com/documentation/swiftui/layoutvaluekey
顺便说一句,另一个问题是问这个模式的名字是什么?