2016-11-09 18 views
2

次のコードが機能しないのはなぜですか?それを機能させるためには何を変更する必要がありますか?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]'は '<'に変換できません"

ありがとうございます。

答えて

3
extension Collection where Iterator.Element: Person 

プロトコルPerson を採用するか、PersonサブクラスあるタイプにIterator.Elementを制限します。どちらも、 struct Personでは不可能であり、完全なコンパイラでは、あなたはおそらく何を意味

error: type 'Iterator.Element' constrained to non-protocol type 'Person'

Personのコレクションへの拡張を制限し

extension Collection where Iterator.Element == Person 

で見つけることができますログインします。 また、プロトコルを定義

protocol HasAge { 
    var age: Int { get } 
} 

Person

struct Person: CustomDebugStringConvertible, Hashable, HasAge { ... } 

で、年齢を持っている要素のコレクションのための拡張を定義することを採用:

extension Collection where Iterator.Element: HasAge { ... } 
+0

説明ありがとうございます。私はIterator.Element == Personがあったことも知りませんでした。 –

+0

@ user3654258:このような "同じタイプの要件"は 'Collection'(それ自体はプロトコル)では可能ですが、現在は' Array'(汎用構造体)ではありません。 –

1

はこれにあなたのコレクションの拡張子を変更

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 
    } 
} 
関連する問題