3
對於Swift的Dictionary
結構上的泛型方法,我有兩個幾乎完全相同的斷言,但一個成功,另一個失敗。我認爲這是XCTAssert
的工作原理,但不明白爲什麼。有沒有人有一個想法,爲什麼?在Swift中使用泛型方法的XCTAssert
如果該方法不是通用的,並且例如T
是String
,則兩個測試都會成功。
extension Dictionary {
func safeElement<T>(key: Key, fallback: T) -> T {
if let value = self[key] as? T {
return value
}
return fallback
}
}
class DictionaryTests: XCTestCase {
let dict = ["foo": "bar"]
func testSafeElement() {
// This succeeds
let bar = dict.safeElement("foo", fallback: "")
XCTAssertEqual(bar, "bar")
// This fails
XCTAssertEqual(dict.safeElement("foo", fallback: ""), "bar")
}
}
更新
我與它擺弄多一點點,而且事實證明,如果你傳遞一個類型作爲參數,則這兩種情況下取得成功。但我想象這種類型的冗長並不是人們想要的。
extension Dictionary {
func safeElement<T>(key: Key, fallback: T, type: T.Type) -> T {
if let value = self[key] as? T {
return value
}
return fallback
}
}
class DictionaryTests: XCTestCase {
let dict = ["foo": "bar"]
func testSafeElement() {
// This succeeds
let bar = dict.safeElement("foo", fallback: "", type: String.self)
XCTAssertEqual(bar, "bar")
// This also succeeds
XCTAssertEqual(dict.safeElement("foo", fallback: "", type: String.self), "bar")
}
}
將盡力報告,謝謝。 –
我增加了一些關於爲什麼我認爲它發生的更多細節。 – jtbandes
我已經更新了這個問題,也許它會給你更多的想法。 –