【发布时间】: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