在The Swift Programming Language
的{{1}}书中,在iBooks Store
章节中,在最后的某个地方,它谈到了 Generic Where Clauses 之后的谈话关于Generics
和constraints
。
给出以下协议:
type constraints
然后声明以下函数:
protocol Container {
associated type Item: Equatable
mutating func append(_ item: Item)
var count: Int { get }
subscript(i: Int) -> Item { get }
}
为了演示此操作,先前声明了以下结构:
func allItemsMatch<C1: Container, C2: Container>(_ someContainer: C1, _ anotherContainer: C2) -> Bool where C1.Item == C2.Item, C1.Item: Equatable {
// Check that both containers contain the same number of items.
if someContainer.count != anotherContainer.count {
return false
}
// Check each pair of items to see if they're equivalent.
for i in 0..<someContainer.count {
if someContainer[i] != anotherContainer[i] {
return false
}
}
// All items match, so return true.
return true
}
现在我们来看看我在Xcode(v9.0,macOS 10.12.6 FYI)中遇到的问题:
struct Stack<Element>: Container {
// original Stack<Element> implementation
var items = [Element]()
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element {
return items.removeLast()
}
// conformance to the Container protocol
mutating func append(_ item: Element) {
self.push(item)
}
var count: Int {
return items.count
}
subscript(i: Int) -> Element {
return items[i]
}
}
我在最后一个var stackOfStrings = Stack<String>()
stackOfStrings.push("uno")
stackOfStrings.push("dos")
stackOfStrings.push("tres")
var arrayOfStrings = ["uno", "dos", "tres"]
if allItemsMatch(stackOfStrings, arrayOfStrings) {
print("All items match.")
} else {
print("Not all items match.")
}
语句的第一行旁边收到以下错误:
if-else
由于我现在已经学习了三个月的编码(并且从头开始),我不知道为什么这会失败,因为我看到了这本书。 有人可以解释为什么这会引发错误并提出可能的解决方案吗?