次のコードが機能しないのはなぜですか?それを機能させるためには何を変更する必要がありますか?Swift 3 - コレクション内の構造体
//: Playground - noun: a place where people can play
import Cocoa
struct Person: CustomDebugStringConvertible, Hashable {
let name: String
let age: Int
// MARK: CustomDebugStringConvertible
var debugDescription: String {
return "\(name) is \(age) years old"
}
// MARK: Hashable
var hashValue: Int {
return name.hashValue^age.hashValue
}
}
func ==(lhs: Person, rhs: Person) -> Bool {
return lhs.name == rhs.name && lhs.age == rhs.age
}
let ilse = Person(name: "Ilse", age: 33)
let mark = Person(name: "Mark", age: 38)
extension Collection where Iterator.Element: Person {
var averageAge: Int {
let sum = self.reduce(0) { $0 + $1.age }
let count = self.count as! Int
return sum/count
}
}
var people = [Person]()
people.append(ilse)
people.append(mark)
let averageAge = people.averageAge
私が構造体をSwiftクラスにすると、それが動作することがわかりました。構造体が値型であることとは何か関係がありますか?最後の行にコンパイラエラーが表示されます。 "'[Person]'は '<'に変換できません"
ありがとうございます。
説明ありがとうございます。私はIterator.Element == Personがあったことも知りませんでした。 –
@ user3654258:このような "同じタイプの要件"は 'Collection'(それ自体はプロトコル)では可能ですが、現在は' Array'(汎用構造体)ではありません。 –