Swift 数组类型推断显示奇怪的编译器错误

Swift 数组类型推断显示奇怪的编译器错误,swift,type-inference,Swift,Type Inference,我发现以下错误: “字符串”不能转换为“字符串” “Double”不能转换为“Decimal” “日期”不能转换为“日期” 在下面的示例中 let someArray = [ SomeBuilder.build( someString: "someString", someDecimal: 100, someDate: Date.make(2018, 8, 20), somethingElse: 0 ), S

我发现以下错误:

“字符串”不能转换为“字符串”

“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
)

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

解决方案:

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

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