swift可以根据let常量的值发出编译器错误吗?

jyztefdp  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(94)

在下面的示例代码中,当结构体初始化时,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()之前更改

sqyvllje

sqyvllje1#

Swift有一个结构,正好适用于这种情况:您可以向枚举案例添加关联值(正如HangerRash在其评论中提到的那样)。
(Google“Swift枚举关联值”。你应该可以找到很多关于这个主题的教程,或者苹果的Swift电子书很好地涵盖了这个主题。
为您的.required案例提供一个保存数据的关联值。

相关问题