2016-11-26 29 views
0

從雨燕編程語言指南:具體類型的錯誤,同時增加約束的協議擴展

extension Collection where Iterator.Element:TextRepresentable 
{ 
    var textualDescription:String { 
     let itemsAsText = self.map { $0.textualDescription } 
     return "[" + itemsAsText.joined(separator: ", ") + "]" 
    } 
} 

...

let hamsters = [murrayTheHamster, morganTheHamster, mauriceTheHamster] 

print(hamsters.textualDescription) 

此時編譯器告訴我:

不支持使用'TextRepresentable'作爲符合協議'TextRepresentable'的具體類型。

我有點驚訝,因爲代碼是右出的語言指導。這是語言指南中的錯誤,還是我輸入了錯誤的內容?或者也許我的編譯器設置是錯誤的?

+0

再看看指南 - 'murrayTheHamster','morganTheHamster'和'mauriceTheHamster'的類型爲'Hamster',不'TextRepresentable'。協議不符合自己,所以你不能使用'TextRepresentable'作爲符合'TextRepresentable'的類型。 – Hamish

回答

0

工作正常,我和Xcode 8.2版測試版(8C23):

import UIKit 

protocol TextRepresentable { 
    var textualDescription: String { get } 
} 

extension Collection where Iterator.Element:TextRepresentable 
{ 
    var textualDescription:String { 
     let itemsAsText = self.map { $0.textualDescription } 
     return "[" + itemsAsText.joined(separator: ", ") + "]" 
    } 
} 

struct Hamster { 
    var name: String 
    var textualDescription: String { 
     return "A hamster named \(name)" 
    } 
} 
extension Hamster: TextRepresentable {} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let murrayTheHamster = Hamster(name: "Murray") 
     let morganTheHamster = Hamster(name: "Morgan") 
     let mauriceTheHamster = Hamster(name: "Maurice") 
     let hamsters = [murrayTheHamster, morganTheHamster, mauriceTheHamster] 

     print(hamsters.textualDescription) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

}