在下面的示例代码中,当结构体初始化时,moreData
采用枚举大小写来指示在访问其内容data
时是否需要额外的内容。
因此存在两个功能来访问内容。一个需要额外的内容,因此如果moreData
标志设置为.notAllowed
,则不应使用,另一个不需要额外的数据,因此如果moreData
标志设置为.required
,则不应使用。.allowed
的第三种情况可以使用这两个函数中的任何一个。
有没有一种方法可以强制Xcode在使用错误的函数时显示编译器错误?
这似乎是它应该能够做的事情,因为它是一个常量,每当结构被初始化时就被设置,所以它的状态应该可以从阅读代码中推断出来。
然而,我能看到的唯一选择就是简单地希望用户正确地使用它,否则抛出一个运行时错误。或者返回一个可选的,以允许代码保护函数是否能够返回可用的数据。
struct Example {
public enum Permissions {
case required
case allowed
case notAllowed
}
let data: String
let moreData: Permissions
init(_ data: String, moreData: Permissions = .notAllowed) {
self.data = data
self.moreData = moreData
}
public func value() -> String {
// if moreData != .required {
return data
// }
// A compiler error should appear is moreData is .required
}
public func value(with extraData: String) -> String {
// if moreData != .notAllowed {
return data + " " + extraData
// }
// A compiler error should appear if moreData is . notAllowed
}
}
let example1 = Example("A String")
let example2 = Example("My name is", moreData: .required)
let value1 = example1.value()
// returns "A String"
let value2 = example2.value(with: "Rebecka")
// returns "My name is Rebecka"
let value3 = example1.value(with: "Extra data")
// This should be a compiler error, as moreData is .notAllowed
// The extra data could just be ignored, but…
let value4 = example2.value()
// …there is no work around for this error as extra data is .required
更新:我认为我的示例作为用例可能有点过于简化,所以我只想详细说明一个示例。结构体的一个用途是将键存储在常量文件中,以避免使用字符串和相关风险。这些可以作为静态let语句存储在枚举或结构中。
struct Keys {
static let stringKey = Example("stringKey")
}
func accessData(with key: Keys) -> String {
// Preparation code
let result = actualAccessFunction(for: key.value())
// Process data
return processedResult
}
在需要moreData
的地方,它可能不仅仅是附加两个字符串,而是可以用来提供一些东西,这些东西将用于以特定的方式重新格式化data
,或者散列或缩写它。
但是moreData
应该是每当进行调用时都需要计算的东西,否则data
的最终计算形式可以被存储。因此,对我来说,必须单独存储moreData
值是没有意义的,因为它必须在每次调用.value()
之前更改
1条答案
按热度按时间sqyvllje1#
Swift有一个结构,正好适用于这种情况:您可以向枚举案例添加关联值(正如HangerRash在其评论中提到的那样)。
(Google“Swift枚举关联值”。你应该可以找到很多关于这个主题的教程,或者苹果的Swift电子书很好地涵盖了这个主题。
为您的
.required
案例提供一个保存数据的关联值。