gpt4 book ai didi

函数中的 Swift 常量(带有计算)?

转载 作者:搜寻专家 更新时间:2023-10-30 23:05:05 27 4
gpt4 key购买 nike

这是一个简单的 Swift 函数

fileprivate func test()->String{
let c = Array("abc".characters)
let k = UInt32(c.count)
let r = Int(arc4random_uniform(k))
return String(c[r])
}

(我选择这个例子是因为,显然,你可能会调用数十亿次来生成某种输出;所以你可能会担心设置这两个常量的性能。)

请注意,它必须进行一些计算才能得到 c,而实际上要得到 k,它必须使用 c

我的问题很简单:每次你调用这个函数

test()
test()
test()

事实上,它会计算 k 和/或 c 每次我调用它, 或者实际上它们只是计算的一次?

(如果“只有一次”,那么出于好奇:它会在我第一次调用该函数时执行此操作?或者编译器可能安排在启动时单独完成它?或者就此而言,它是否知道它可以计算他们在编译期间?)


我经常使用全局计算属性,而不是像这样

let basicDF : DateFormatter = {
print("this will only be done once per launch of the app")
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
return formatter
}()

(可能与fileprivate)如果上述问题的答案是“不,c和'k'在每次调用test时都会计算”,那么在那个案例如何将一种静态计算属性放入函数中??

最佳答案

不,在您的特定情况下,编译器当前不会将 c 和/或 k 优化为仅计算一次的常量表达式(这可以通过examining the IR 在优化的构建中)——尽管这一切都可能随着语言的 future 版本而改变。

但值得注意的是,它目前可以为更简单的表达式执行此操作,例如:

func foo() -> Int {
return 2 + 4
}

编译器可以在编译时计算加法,所以函数只是return 6(然后可以内联)。但当然,如果您确实将给定函数确定为性能瓶颈,那么您首先应该只担心此类优化。

在函数中获取静态常量的一个好技巧是在函数范围内定义一个具有静态属性的无大小写 enum,您可以在其中定义常量表达式:

func test() -> String {

enum Constants {
static let c = Array("abc".characters)
static let k = UInt32(c.count)
}

let r = Int(arc4random_uniform(Constants.k))
return String(Constants.c[r])
}

现在 ck 的初始化表达式都只会被求值一次,这将在它们第一次使用时完成(即当函数第一次被调用时).

当然,正如您所展示的,您可以使用立即求值的闭包来获得多行初始化表达式:

enum Constants {
static let c: [Character] = {
// ...
return Array("abc".characters)
}()
// ...
}

关于函数中的 Swift 常量(带有计算)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43821827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com