Saj*_*jon 6 operators operator-precedence ios swift swift3
在Swift 3中,我编写了一个自定义运算符prefix operator §,我在一个方法中使用Stringas值返回一个LocalizedStringstruct(保持键和值).
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)!!"
}
}
Run Code Online (Sandbox Code Playgroud)
(是的,我知道SwiftGen中令人敬畏的L10n枚举,但我们正在从后端下载我们的字符串,这个问题更多的是关于如何使用自定义运算符)
但是,如果我们想要得到什么从结果翻译值§运算符(即物业value从得到的LocalizedString)
let translation = §"MyKey".value // Compile error "Value of type 'String' has no member 'value'"
Run Code Online (Sandbox Code Playgroud)
我们当然可以通过将它包装在括号中来轻松修复此编译错误(§"MyKey").value.但如果不想这样做.是否可以设置与'dot'文字相关的自定义运算符的优先级?
是的我知道只有中缀运算符可以声明优先级,但为了达到我想要的目的,以某种方式使用优先级是有意义的:
precedencegroup Localization { higherThan: DotPrecedence } // There is no such group as "Dot"
prefix operator §: Localization
Run Code Online (Sandbox Code Playgroud)
要标记Swift编译器首先应该评估§"MyKey"并理解它不是字符串,而实际上是LocalizedString(struct).
感觉不太可能这不可能吗?我错过了什么?
它.不像标准库中定义的所有其他运算符,而是由编译器提供.它的语法是Explicit Member Expressions.
优先级高于.编译器应该让你做的事情,因为它是一个基本的用例.想象一下,如果编译器启用了这样的东西你可以做什么:
-"Test".characters.count
Run Code Online (Sandbox Code Playgroud)
如果你的优先级高于.,编译器必须检查所有可能性:
(-"Test").characters.count // func -(s: String) -> String
(-("Test".characters)).count // func -(s: String.CharacterView) -> String.CharacterView
-("Test".characters.count) // func -(s: Int) -> Int
Run Code Online (Sandbox Code Playgroud)
这将
我建议你做的是用一个新的运算符放弃这个想法,它只会通过将一些特定的行为压缩成一个不起眼的角色来增加更多的认知负荷.我就是这样做的:
extension String {
var translatedString : String {
return translate(using: self)
}
}
"MyKey".localizedString
Run Code Online (Sandbox Code Playgroud)
或者如果你想使用你的LocalizedString:
extension String {
var localized : LocalizedString {
return LocalizedString(key: self)
}
}
"MyKey".localized.value
Run Code Online (Sandbox Code Playgroud)
这些版本更加全面.
| 归档时间: |
|
| 查看次数: |
318 次 |
| 最近记录: |