【问题标题】:How I set a default struct initializer to get rid on an Ambiguous init use error?如何设置默认结构初始化程序以摆脱不明确的初始化使用错误?
【发布时间】:2022-01-02 11:08:38
【问题描述】:

我有一个带有两个相似初始化块的 SwiftUI 视图。它们之间唯一不同的是 Optional 属性的类型(具有默认值)。因为它是可选的,所以当我调用没有它的视图时,我得到一个Ambiguous use of 'init' 错误。

我希望第一个 init 成为 View 的默认初始化程序。

它是这样的:

struct NewView: View {

  var a: String
  var b: String
  var c: AnyShapeStyle
  var d: String

  init(a: String, 
       b: String,
       c: LinearGradient =  LinearGradient(gradient: Gradient(colors: [Color.green, Color.blue]), startPoint: .top, endPoint: .bottom),
       d: String = "Linear") {
    
    self.a = a
    self.b = a
    self.c = AnyShapeStyle(c)
    self.d = d
  }

  init(a: String, 
       b: String,
       c: AngularGradient =  AngularGradient(colors: [.green, .blue], center: .center),
       d: String = "Angular") {
    
    self.a = a
    self.b = a
    self.c = AnyShapeStyle(c)
    self.d = d
  }
  ...
}

因此像这样调用视图会给我错误:

NewView(a: "a", b: "b")

【问题讨论】:

  • 用 AngularGradient 为 c 调用单元,然后用字符串“Linear”为 d 调用单元会是什么结果?
  • 那么你希望什么时候调用另一个初始化器?具体来说,您希望何时使用默认值AngularGradient(colors: [.green, .blue], center: .center)
  • @Fogmeister d 的字符串无关紧要我只是展示了一个包含两个必需属性和两个具有默认值的属性的示例
  • @Sweeper 我希望能够用线性渐变或角度渐变填充视图。因此,默认情况下,我将填充设置为线性渐变,但视图可以使用自定义线性或角度渐变填充。

标签: swift swiftui


【解决方案1】:

您可以使用不同的参数标签来区分初始值设定项。


struct NewView: View {
  ...
  init(name a: String, 
       b: String,
       c: AngularGradient =  AngularGradient(colors: [.green, .blue], center: .center),
       d: String = "Angular") {
    
    ...
  }
  ...
}

现在,无论何时调用以下命令,都会使用带有 LinearGradient 的初始化程序。

NewView(a: "a", b: "b")

若要使用AngularGradient 调用初始化程序,请编写以下代码:

NewView(name: "a", b: "b")

每当您重载方法时,请确保编写自我解释的参数标签,这将有助于调用者选择正确的方法/初始化程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多