为什么这个结构隐藏了 String 类型?
Why this struct shadows the type String?
我正在尝试了解 属性 包装器。
我有另一个关于 SO 的问题,我试图创建一个 属性 包装器,如下所示:
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
}
}
}
这行不通,因为行 value.findReplace
显示错误
Value of type String? has no name findReplace
一旦有人建议我将结构行更改为
struct AdjustTextWithAppName {
整个事情开始工作了。
为什么?我无法理解为什么结构上的 <String>
项会影响我创建的 String
类型的扩展。
这是为什么?
I cannot understand why <String>
term on the struct was shadowing the extension to the String
type I have created.
为什么不呢?您明确要求 AdjustTextWithAppName
有一个名为 String
的泛型类型参数。编译器准确地为您提供了您所要求的内容。
将 <String>
替换为常见的通用类型 <T>
,您会立即看到问题
@propertyWrapper
struct AdjustTextWithAppName<T> {
private var value: T?
init(wrappedValue: T?) {
self.value = wrappedValue
}
var wrappedValue: T? {
get { value }
set {
if let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String {
let replaced = value.findReplace("$$$", withString: localizedAppName) // Value of type 'T' has no member 'findReplace'
}
value = nil
}
}
}
现在错误更容易理解了
Value of type 'T' has no member 'findReplace'
我正在尝试了解 属性 包装器。
我有另一个关于 SO 的问题,我试图创建一个 属性 包装器,如下所示:
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
}
}
}
这行不通,因为行 value.findReplace
显示错误
Value of type String? has no name findReplace
一旦有人建议我将结构行更改为
struct AdjustTextWithAppName {
整个事情开始工作了。
为什么?我无法理解为什么结构上的 <String>
项会影响我创建的 String
类型的扩展。
这是为什么?
I cannot understand why
<String>
term on the struct was shadowing the extension to theString
type I have created.
为什么不呢?您明确要求 AdjustTextWithAppName
有一个名为 String
的泛型类型参数。编译器准确地为您提供了您所要求的内容。
将 <String>
替换为常见的通用类型 <T>
,您会立即看到问题
@propertyWrapper
struct AdjustTextWithAppName<T> {
private var value: T?
init(wrappedValue: T?) {
self.value = wrappedValue
}
var wrappedValue: T? {
get { value }
set {
if let localizedAppName = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String {
let replaced = value.findReplace("$$$", withString: localizedAppName) // Value of type 'T' has no member 'findReplace'
}
value = nil
}
}
}
现在错误更容易理解了
Value of type 'T' has no member 'findReplace'