swift - Swift:可以禁用结构的隐式字符串插值吗?
问题描述
我使用包装多语言字符串的结构,很容易意外打印结构类型名称而不是字符串,如下所示:
struct MultilangStringStruct {
let en: String
let de: String
init(en: String, de: String) {
self.en = en
self.de = de
}
}
let s = MultilangStringStruct(en: "Of course", de: "Jawohl")
/// Oops, we forgot to use s.en, and it prints this, with no compiler warning:
/// Commander said "MultilangString(en: "Of course", de: "Jawohl")"!
print("The commander said \"\(s)\"!")
我可以以某种方式修改结构以防止这种隐式转换为字符串吗?我希望 swift 编译器产生错误或警告,我可以注意到并修复s
到s.en
.
解决方案
您可以使用CustomStringConvertible
协议来自定义文本表示。
苹果文档
在该属性中,您可以使用from或fromdescription
将日志记录添加到控制台。os_log
os.log
NSLog
Foundation
例子
import os.log
struct MultilangStringStruct {
let en: String
let de: String
init(en: String, de: String) {
self.en = en
self.de = de
}
}
extension MultilangStringStruct: CustomStringConvertible {
var description: String {
os_log(.error, "Not implemented")
return "Not implemented"
}
}
let s = MultilangStringStruct(en: "Of course", de: "Jawohl")
print("The commander said \"\(s)\"!")
// Console output
1968-04-26 01:23:47.346953+0300 YourApp[85507:7491471] MultilangStringStruct: Not implemented
The commander said "Not implemented"!
推荐阅读
- javascript - 我需要在 React 应用程序中突出显示搜索到的文本
- c - 如果地址与单词中的其他十六进制数字一起存在,如何写入地址
- angularjs - 如何在angular js中为输入类型文件赋值以编辑表单
- angular - 选择器在角度(ngrx)中没有任何状态
- c++ - 类中的重载 != 函数允许使用哪些参数类型
- ruby-on-rails - Rails 服务器端验证问题
- node.js - 在 Sequelize 中加入或填充查询
- android-emulator - 模拟器:模拟器:错误:没有足够的空间来创建用户数据分区
- msdeploy - MSdeploy 跳过根 webconfig
- ruby - 替换字符串中的反斜杠