Swift编程语言 - 泛型 - Where子句的问题

时间:2017-11-09 19:30:12

标签: swift generics swift3 where-clause

The Swift Programming Language的{​​{1}}书中,在iBooks Store章节中,在最后的某个地方,它谈到了 Generic Where Clauses 之后的谈话关于Genericsconstraints。 给出以下协议:

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

由于我现在已经学习了三个月的编码(并且从头开始),我不知道为什么这会失败,因为我看到了这本书。 有人可以解释为什么这会引发错误并提出可能的解决方案吗?

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 您错误地复制了协议定义,它应该是:
  2. protocol Container {
      associatedtype Item
      mutating func append(_ item: Item)
      var count: Int { get }
      subscript(i: Int) -> Item { get }
    }
    

    part 1

    1. 您忘记添加符合ArrayContainer的重要行:
    2. extension Array: Container {}
      

      part 2