Ответ 1
Сообщение об ошибке вводит в заблуждение. На самом деле вам нужно предоставить компилятору способ сравнить два экземпляра Meme
и решить, на каком критерии эти экземпляры равны.
Предположим, вы хотите, чтобы два экземпляра, имеющие одинаковое свойство name
, считались равными.
Мы сопоставляем структуру с Equatable
и создаем оператор ==
, который сравнивает две структуры по свойству имени:
struct Meme:Equatable {
var name:String!
}
func ==(lhs: Meme, rhs: Meme) -> Bool {
return lhs.name == rhs.name
}
Теперь мы можем использовать indexOf
с экземпляром Meme:
let doge = Meme(name: "doge")
let lolcat = Meme(name: "lolcat")
let memes = [lolcat, doge]
if let dogeIndex = memes.indexOf(doge) {
print(dogeIndex) // 1
}
Если вы хотите сравнить два экземпляра не по свойству name
, а по их уникальности, вам нужно будет сделать структуру соответствующей Hashable
и использовать уникальное свойство hashValue
, возвращающее значение Int:
struct Meme:Hashable {
var name:String!
var hashValue: Int {
return self.name.hashValue
}
init(name: String) {
self.name = name
}
}
func ==(lhs: Meme, rhs: Meme) -> Bool {
return lhs.hashValue == rhs.hashValue
}
let doge = Meme(name: "doge")
let lolcat = Meme(name: "lolcat")
let memes = [lolcat, doge]
if let dogeIndex = memes.indexOf(doge) {
print(dogeIndex) // 1
}
В этом примере hashValue
сделан из self.name
, поэтому два разных экземпляра Meme с одинаковым именем будут считаться равными. Если вы этого не хотите, используйте другой источник для хэш-значения.
Примечание: в Swift 3, indexOf
стал index(of:)
, поэтому в этом примере мы изменили бы memes.indexOf(doge)
на memes.index(of: doge)
.