【问题标题】:Array type inference shows weird compiler errors数组类型推断显示奇怪的编译器错误
【发布时间】:2019-05-01 12:49:56
【问题描述】:

我收到以下错误:

'String' 不能转换为'String?'

'Double' 不能转换为'Decimal'

“日期?”不能转换为“日期”

在下面的例子中

let someArray = [
    SomeBuilder.build(
        someString: "someString",
        someDecimal: 100,
        someDate: Date.make(2018, 8, 20),
        somethingElse: 0
    ),
    SomeBuilder.build(
        someString: "someString",
        someDecimal: 100,
        someDate: Date.make(2018, 8, 20),
        somethingElse: 0
    ),
    SomeBuilder.build(
        someString: "someString",
        someDecimal: 100,
        someDate: Date.make(2018, 8, 20),
        somethingElse: 0
    )
]

struct SomeBuilder {
    static func build(
    someString: String?,
    someDecimal: Decimal,
    someDate: Date,
    somethingElse: Int
    ) -> SomeModel {
        // do something here
        return SomeModel()
    }
}

extension Date {

    static func make(_ year: Int, _ month: Int, _ day: Int) -> Date! {
        let calendar = Calendar(identifier: .gregorian)
        let components = DateComponents(
            calendar: calendar,
            year: year,
            month: month,
            day: day
        )
        return calendar.date(from: components)
    }

}

struct SomeModel {
}

如果您将其作为第四项添加到someArray,(在实际情况下可能是意外)您将看到上述错误之一。

SomeBuilder.build(
    someString: "someString",
    someDecimal: 100,
    someDate: Date.make(2018, 8, 20),
    somethingElsse: 0
)

【问题讨论】:

  • 您应该edit 您的问题以minimal reproducible example 的形式包含所有相关代码。您当前的代码甚至无法编译,并且进行必要的更改以使其编译也会使您提到的错误消失。
  • 完成。这是一种奇怪的 xcode 行为,我期待有类似问题的人有完全不同的代码
  • 这仍然不是minimal reproducible example,因为您的代码中存在语法错误。 build 方法缺少 func 关键字,假设它应该是一个函数,在最后一个输入参数类型之后有一个额外的 ,,make 也缺少一个 return 语句。
  • 完成。我无法在此处添加所有代码,但这里是重现它的步骤。
  • somethingElse 函数没有 somethingElse 输入参数,所以如果你去掉额外的参数,错误就会消失而无需使用类型注释。编译器错误是误导,你是对的,但是你提到的问题只能通过调用一个不存在的函数(在build添加一个额外的输入参数)来触发,这显然是一个程序员错误。

标签: swift type-inference


【解决方案1】:

我们发现类型推断是导致问题的原因,添加数组类型有助于编译器找到确切的问题(如果存在)。

解决方案:

let someArray: [SomeModel] = [
    ...
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 2016-01-23
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多