【问题标题】:Protocol Extension Error Array协议扩展错误数组
【发布时间】:2016-10-10 04:04:48
【问题描述】:

我正在从 Apple 论坛编写一些代码。一切似乎都正确,但我不断收到两个错误。有人请帮忙。代码如下,后面跟着错误。

protocol Container{
associatedtype ItemType
mutating func append(item: ItemType)
var count:Int{get}
subscript(i:Int)->ItemType{get}
}

extension Array: Container {}

func checkToSeeIfItemsEqual<C1:Container, C2:Container>(container1:C1, container2:C2) -> Bool where C1.ItemType == C2.ItemType, C1.ItemType:Equatable{

if container1.count != container2.count{
    return false
}
for i in 0..<container1.count{
    if container1[i] != container2[i]{
        return false
    }
}
return true
}

var damnArray = [1, 2, 4]
var damnArray2 = [1, 2, 4]
let theBool = checkToSeeIfItemsEqual(container1: damnArray, container2: damnArray2)
print(theBool)

【问题讨论】:

  • 您的 append 方法定义略有不同。您需要添加一个下划线: mutating func append(_ item: ItemType) 。但是还有其他问题......我让它工作而不是为你的数组使用任何类型
  • 我认为在尝试查看“任何”是否相等时可能会吓坏

标签: arrays swift inheritance


【解决方案1】:

Any 不相等,因此不能使用 Any 数组调用 checkToSeeIfItemsEqual。

我不确定您到底想做什么,但我认为您可能误解了 equatable 的工作原理。表达式两边的类型必须是已知的并且相同。例如Bool == Bool。如果你有一个数组,你无法知道数组的元素是什么类型,因此无法比较它们。

如果你想比较两个相同类型的数组,你可以这样做:

func arraysAreEqual<ElementType: Equatable>(firstArray: [ElementType], secondArray: [ElementType]) -> Bool {

    guard firstArray.count == secondArray.count else {
        return false
    }

    for i in 0..<firstArray.count{
        if firstArray[i] != secondArray[i]{
            return false
        }
    }
    return true
}

【讨论】:

  • 好的,我更新了代码,但仍然遇到与所需追加相同的第一个错误。
  • 关于 nvm 我想通了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多