Swift 在enum';s函数?

Swift 在enum';s函数?,swift,Swift,Swift提供了一个非常方便的lazy var 然而,我想知道,我们能为Enum的函数实现类似的惰性功能吗 比如说, class Utils { static let userDataDirectory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0] } enum UserDataDirectory : String { case Extract = "e

Swift提供了一个非常方便的
lazy var

然而,我想知道,我们能为
Enum
的函数实现类似的惰性功能吗

比如说,

class Utils {
    static let userDataDirectory = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)[0]
}

enum UserDataDirectory : String {
    case Extract = "extract"
    case Camera = "camera"
    case Mic = "mic"
    case Attachment = "attachment"
    case Recording = "recording"
    case RestoreAttachment = "restore_attachment"
    case RestoreRecording = "restore_recording"

    func get() -> URL {
        return Utils.userDataDirectory.appendingPathComponent(self.rawValue)
    }
}
是否可能将
enum UserDataDirectory
get
函数变为惰性求值行为


或者,有没有一种方法可以避免每次计算
appendingPathComponent
,因为
Utils.userDataDirectory
self.rawValue
是常量?

您的意思是需要一个延迟计算的静态值。这很简单;添加静态缓存:

enum UserDataDirectory : String {
    // ...

    // Define storage
    private static var urls: [Self: URL] = [:]

    func url() -> URL {
        // Check the cache
        if let url = Self.urls[self] {
            return url
        } else {
            // Compute and cache
            let url = Utils.userDataDirectory.appendingPathComponent(self.rawValue)
            Self.urls[self] = url
            return url
        }
    }
}

您的意思是需要一个延迟计算的静态值。这很简单;添加静态缓存:

enum UserDataDirectory : String {
    // ...

    // Define storage
    private static var urls: [Self: URL] = [:]

    func url() -> URL {
        // Check the cache
        if let url = Self.urls[self] {
            return url
        } else {
            // Compute and cache
            let url = Utils.userDataDirectory.appendingPathComponent(self.rawValue)
            Self.urls[self] = url
            return url
        }
    }
}

这个问题毫无意义。像您的
get()
这样的函数已经是“懒惰”的:在调用它之前不会对其求值,这正是“懒惰”的意思。从这个意义上讲,
appendingPathComponent
最多只能执行一次,甚至
get()
被称为N次。马特的观点是,斯威夫特使用了一个令人困惑且不一致的词“lazy”。在“lazy-var”的意义上,它意味着一些语言称之为“memorized”。斯威夫特收集方法。“lazy”与许多其他语言(以及大多数CS讨论)所说的“lazy”相匹配,后者是“按需评估”的意思。嗯,它永远不能只执行一次,因为有七个案例。正如我在评论Rob的回答时所说,你描述的是记忆,而不是懒惰。这个问题毫无意义。像您的
get()
这样的函数已经是“懒惰”的:在调用它之前不会对其求值,这正是“懒惰”的意思。从这个意义上讲,
appendingPathComponent
最多只能执行一次,甚至
get()
被称为N次。马特的观点是,斯威夫特使用了一个令人困惑且不一致的词“lazy”。在“lazy-var”的意义上,它意味着一些语言称之为“memorized”。斯威夫特收集方法。“lazy”与许多其他语言(以及大多数CS讨论)所说的“lazy”相匹配,后者是“按需评估”的意思。嗯,它永远不能只执行一次,因为有七个案例。正如我在评论Rob的回答时所说,你所描述的是记忆化,而不是懒惰。我认为这里的词是“记忆化”,而不是“懒惰”。是的,但斯威夫特混淆地使用了关键字
lazy
来指代记忆化。这实现了相同的模式。不,我不这么认为。它们是正交的,不是吗?“懒惰”意味着我们在第一次被要求提供一个值之前不会进行第一次评估。“记忆化”我们确实是第一次评估,但不是在那之后。@matt我认为Swift使用了不同的术语。如果你看看iOS的
lazy var
,它有你的“memoize”行为。我认为这里的词是“memoize”,而不是“lazy”。是的,但斯威夫特选择混淆地使用关键字
lazy
来表示memoized。这实现了相同的模式。不,我不这么认为。它们是正交的,不是吗?“懒惰”意味着我们在第一次被要求提供一个值之前不会进行第一次评估。“记忆化”我们确实是第一次评估,但不是在那之后。@matt我认为Swift使用了不同的术语。如果你看看iOS的
惰性变量
,它有你的“记忆化”行为。