Массив ошибок расширения протокола

#arrays #swift #inheritance

#массивы #swift #наследование

Вопрос:

Я писал некоторый код с форума 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)
  

введите описание изображения здесь

Комментарии:

1. Ваше определение метода для append немного отличается. Вам нужно добавить символ подчеркивания: добавление мутирующей функции (_ item: ItemType) . Но что-то еще тоже не так… Я заставил его работать, не используя какой-либо тип для вашего массива

2. Я думаю, что это может вызвать беспокойство при попытке выяснить, является ли «Any» равнозначным

Ответ №1:

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
}
  

Комментарии:

1. Хорошо, я обновил код и по-прежнему получал ту же первую ошибку, которая говорит о требуемом добавлении.

2. O nvm я понял это