【问题标题】:How can I create a static computed property that computes only once?如何创建只计算一次的静态计算属性?
【发布时间】:2017-08-18 12:56:59
【问题描述】:

我已经创建了一个计算的静态属性,我希望对其计算一次,之后无论何时访问都只会返回原始计算值。 lazy 属性似乎是我想要的,但经过一番搜索后,静态属性似乎默认为 lazy

当我运行以下代码时,如果我单独运行每个单元测试,它在第一次访问时会正常运行。但是,当我第二次访问它时,我得到了一个空数组。

static var att: [ConferenceNumber] = {
    let list = buildDirectory(for: .att, from: jsonArray)
    return list
}()

private static let jsonArray: [Any]? = {
    let numbersFilePath = Bundle.main.path(forResource: "numbers", ofType:"json")
    let data = try! Data(contentsOf: URL(fileURLWithPath:numbersFilePath!), options: .uncached)

    return try! JSONSerialization.jsonObject(with: data) as? [Any]
}()

第二次调用并返回空数组的代码

private static func isAttMeeting(meetingText: String, parsedPhoneNumbers: [String]) -> Bool {
    let attPhoneNumbers = ConferenceNumberDirectory.att.map{$0.number}
    let attNumberWasParsed = parsedPhoneNumbers.intersects(with: attPhoneNumbers)
    if attNumberWasParsed {
        return true
    }
    return meetingText.contains(pattern: attURLRegex) || meetingText.contains(pattern: attURLRegex2)
}

【问题讨论】:

  • 第二次怎么访问?你能添加一些代码来看看你到底在做什么吗?
  • 您的 att 属性不是计算属性,因为您为其分配了一个值。
  • @AndréSlotta 这是造成我问题的原因吗?

标签: ios swift


【解决方案1】:

您的解决方案应该有效。也许您的代码的其他部分有问题。看看下面的例子:

var myStrings = ["a", "b"]

class SomeClass {
    static let strings: [String] = {
        return myStrings
    }()
}

print("myStrings: \(myStrings)")
print("static strings: \(SomeClass.strings)")

myStrings.append("c")

print("myStrings: \(myStrings)")
print("static strings: \(SomeClass.strings)")

打印:

myStrings: ["a", "b"]
static strings: ["a", "b"]
myStrings: ["a", "b", "c"]
static strings: ["a", "b"]

所以对你来说,下面的代码应该可以工作:

class ConferenceNumberDirectory {
    static let att: [ConferenceNumber] = {
        return buildDirectory(for: .att, from: jsonArray)
    }()
}

【讨论】:

  • 看起来你是对的。当另一个测试似乎在当前测试可以为它们分配任何东西之前将这些值设置为空时,我太快地假设这被写入了两次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多