Ios 为什么此结构会隐藏类型字符串?
我试图理解财产包装 我还有一个问题,我试图创建一个属性包装器,如下所示:Ios 为什么此结构会隐藏类型字符串?,ios,swift,swift4,swift5,Ios,Swift,Swift4,Swift5,我试图理解财产包装 我还有一个问题,我试图创建一个属性包装器,如下所示: extension String { func findReplace(_ target: String, withString: String) -> String { return self.replacingOccurrences(of: target, with: withString,
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
}
}
}
整个事情开始起作用了
为什么??我无法理解为什么结构上的
术语将扩展隐藏到我创建的字符串类型
为什么呢
我无法理解为什么结构上的
术语将扩展隐藏到我创建的字符串类型
为什么不呢?您明确要求为AdjustTextWithAppName
提供名为String
的泛型类型参数。编译器提供的正是您所要求的。将
替换为通用泛型类型
,您将立即看到问题
@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
}
}
}
@propertyWrapper
结构AdjustTextWithAppName{
私有var值:T?
init(wrappedValue:T?){
self.value=wrappedValue
}
var wrappedValue:T{
获取{value}
设置{
如果让localizedAppName=Bundle.main.localizedInfoDictionary?[“CbundLename”]作为?字符串{
let replaced=value.findReplace(“$$”,带字符串:localizedAppName)//类型为“T”的值没有成员“findReplace”
}
值=零
}
}
}
现在这个错误更容易理解了
类型“T”的值没有成员“findReplace”
我认为struct创建的是结构,而不是类型。在我看来,AdjustTextWithAppName将创建一个名为AdjustTextWithAppName的字符串类型结构,因为Array将创建一个字符串数组。我无法理解为什么相同的语法会产生两种不同的东西。@SpaceDog“我无法理解为什么相同的语法会产生两种不同的东西。”你在学习Swift的过程中,通过跟踪、错误、沮丧的发帖、勉强接受的答案、冲洗和重复,强迫自己前进。你应该花一些时间学习基础知识,因为你将永远陷于这种挫折的循环中。关键字struct
确实声明了结构。结构是类型,因此它显然也声明类型<代码>在我看来,AdjustTextWithAppName会创建一个名为AdjustTextWithAppName的字符串类型结构,这完全是错误的。类型标识符后面的
是泛型类型参数列表。“of type String”将表示为子类型关系,拼写为subtype:supertype
,这对于String
是不可能的,因为String
是一个结构,而structs不能被子类型化。as Array将根据前面语句的逻辑创建一个字符串数组,您会得出结论,这应该“创建一个名为Array
的String
类型的结构”,这是没有意义的。实际情况是,Array
是一个结构,有一个泛型类型参数(称为Element
),声明为struct Array
()。我不是在做反复试验。财产包装是我无法理解(故意双关语)的东西。这个概念很简单,但语法很疯狂。“疯子”在Swift中赢得了战争,语法每次都更荒谬。但这是你今天早些时候问过的问题的副本,为什么要问两次同样的问题?不是副本。在第一个问题中,我试图理解出了什么问题。在这个问题中,我试图理解为什么。这就是为什么在方法中,泛型类型应该使用单字母
@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
}
}
}