结构(保存键和值)。 p-6ren">
gpt4 book ai didi

ios - Swift:与点 (".") 文字相关的自定义运算符的优先级

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

在 Swift 3 中,我编写了一个自定义运算符 prefix operator §,我在一个方法中使用它,将 String 作为返回 LocalizedString 的值> 结构(保存键和值)。

public prefix func §(key: String) -> LocalizedString {
return LocalizedString(key: key)
}

public struct LocalizedString {
public var key: String
public var value: String

public init(key: String) {
let translated = translate(using: key) // assume we have this
self.key = key
self.value = translated ?? "!!\(key)!!"
}
}

(是的,我知道很棒的 L10n enum in SwiftGen ,但我们正在从后端下载我们的字符串,这个问题更多的是关于如何使用自定义运算符)

但是如果我们想从 § 运算符的结果中获取翻译后的值怎么办(即来自结果 LocalizedString 的属性 value)

let translation = §"MyKey".value // Compile error "Value of type 'String' has no member 'value'"

当然,我们可以通过将其包裹在括号 (§"MyKey").value 中来轻松修复此编译错误。但如果不想那样做。 是否可以为与“点”文字相关的自定义运算符设置优先级

是的,我知道只有中缀运算符 可以声明优先级,但以某种方式处理优先级以实现我想要的效果是有意义的:

precedencegroup Localization { higherThan: DotPrecedence } // There is no such group as "Dot"
prefix operator §: Localization

标记 Swift 编译器首先应该评估 §"MyKey" 并理解它不是字符串,而是一个 LocalizedString(结构)。

觉得这不太可能是不可能的?我错过了什么?

最佳答案

. 不像标准库中定义的所有其他运算符那样是运算符,它是由编译器提供的。它的语法是 Explicit Member Expressions .

具有比 . 更高的优先级是编译器不应该让你做的,因为它是一个基本的用例。想象一下,如果编译器启用了这样的功能,您会怎么做:

-"Test".characters.count

如果您的优先级可以高于 .,编译器必须检查所有可能性:

(-"Test").characters.count   // func -(s: String) -> String
(-("Test".characters)).count // func -(s: String.CharacterView) -> String.CharacterView
-("Test".characters.count) // func -(s: Int) -> Int

哪个会

  • 可能会大大增加编译时间
  • 模棱两可
  • 可能在添加重载时改变现有代码的行为

我建议您放弃使用新运算符的想法,它只会通过将某些特定行为压缩为单个晦涩的角色来增加更多的认知负担。我会这样做:

extension String {
var translatedString : String {
return translate(using: self)
}
}

"MyKey".localizedString

或者如果你想使用你的LocalizedString:

extension String {
var localized : LocalizedString {
return LocalizedString(key: self)
}
}

"MyKey".localized.value

这些版本更加全面。

关于ios - Swift:与点 (".") 文字相关的自定义运算符的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933543/

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