尝试为应该调整字符串的 属性 制作包装器
Trying to make a wrapper for a property that should adjust a string
我有这段代码需要让其他应用程序可以重复使用。
此代码显示包含本地化应用程序名称的消息。
所以,我有这样的本地化字符串:
"DoYou" = "Do you really want to close $$$?";
"Quit" = "Quit $$$";
"Keep Running" = "Keep $$$ Running";
其中 $$$
必须在 运行 时替换为本地化应用程序的名称。
因为我想了解 属性 包装器,所以我尝试创建这个:
extension String {
func findReplace(_ target: String, withString: String) -> String
{
return self.replacingOccurrences(of: target,
with: withString,
options: NSString.CompareOptions.literal,
range: nil)
}
}
@propertyWrapper
struct AdjustTextWithAppName<String> {
private var value: String?
init(wrappedValue: String?) {
self.value = wrappedValue
}
var wrappedValue: String? {
get { value }
set {
if let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String {
let replaced = value.findReplace("$$$", withString: localizedAppName)
}
value = nil
}
}
}
我在 replaced
行收到此错误:
Value of type String? has no name findReplace
我也试过用这条线
let replaced = value!.findReplace("$$$", withString: localizedAppName)
同样的错误...
该字符串可能多次包含应用程序的名称。这就是为什么我将扩展名 String
.
为了解决这个问题,您的 属性 包装器不能有一个名为 String 的通用类型,因为它隐藏了您的扩展所属的内置类型 String。因此,将 struct
声明更改为非通用
@propertyWrapper
struct AdjustTextWithAppName {
或将类型命名为其他名称
@propertyWrapper
struct AdjustTextWithAppName<T> {
并修复 set
方法
set {
guard let str = newValue, let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String else {
value = nil
}
value = str.findReplace(target: "$$$", withString: localizedAppName)
}
我有这段代码需要让其他应用程序可以重复使用。
此代码显示包含本地化应用程序名称的消息。
所以,我有这样的本地化字符串:
"DoYou" = "Do you really want to close $$$?";
"Quit" = "Quit $$$";
"Keep Running" = "Keep $$$ Running";
其中 $$$
必须在 运行 时替换为本地化应用程序的名称。
因为我想了解 属性 包装器,所以我尝试创建这个:
extension String {
func findReplace(_ target: String, withString: String) -> String
{
return self.replacingOccurrences(of: target,
with: withString,
options: NSString.CompareOptions.literal,
range: nil)
}
}
@propertyWrapper
struct AdjustTextWithAppName<String> {
private var value: String?
init(wrappedValue: String?) {
self.value = wrappedValue
}
var wrappedValue: String? {
get { value }
set {
if let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String {
let replaced = value.findReplace("$$$", withString: localizedAppName)
}
value = nil
}
}
}
我在 replaced
行收到此错误:
Value of type String? has no name
findReplace
我也试过用这条线
let replaced = value!.findReplace("$$$", withString: localizedAppName)
同样的错误...
该字符串可能多次包含应用程序的名称。这就是为什么我将扩展名 String
.
为了解决这个问题,您的 属性 包装器不能有一个名为 String 的通用类型,因为它隐藏了您的扩展所属的内置类型 String。因此,将 struct
声明更改为非通用
@propertyWrapper
struct AdjustTextWithAppName {
或将类型命名为其他名称
@propertyWrapper
struct AdjustTextWithAppName<T> {
并修复 set
方法
set {
guard let str = newValue, let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String else {
value = nil
}
value = str.findReplace(target: "$$$", withString: localizedAppName)
}