Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么此结构会隐藏类型字符串?_Ios_Swift_Swift4_Swift5 - Fatal编程技术网

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
      }
    }
  }