什么是"扩展集合Iterator.Element:Textrepresentable"在这个例子中做什么?

时间:2017-02-19 14:39:36

标签: swift

我得到了这个协议和实现它的结构。

 protocol TextRepresentable {
    var textualDescription: String { get }
}


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

以下代码如何运作?

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

以下代码的扩展程序集是什么?

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

print(hamsters.textualDescription)

2 个答案:

答案 0 :(得分:2)

此代码

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

Collection上创建一个扩展程序,该扩展程序仅在Collection 中的元素 TextRepresentable时有效(即符合协议TextRepresentable })。 如果是CollectionArrayCollection)的情况,则扩展程序会将计算属性textualDescription添加到Collection

在示例代码hamsters中,只包含符合Hamster的{​​{1}}类型的对象。因此,编译器知道扩展名对您的TextRepresentable Array有效,并且属性hamsters可用。

textualDescription的实施也相当简单。

textualDescription

答案 1 :(得分:0)

让我们一块一块地把它拿走。这段代码:

<div class="container">
  @html.Partial("_partialview")
</div>
//you have to include the JQuery within the view not PartialView

<script>
    $(document).ready(function(e) {
        e.preventDefault();

        var _date = $("#date").text();
        $.Ajax({
            type: 'Post',
            url: "Action/Controller",
            data: {
                date: _date
            },
            success: function(data)
            {
                //action
            },
            error: function(data)
            {
                //action
            }

        });
    });
</script>

定义符合Collection的类型的扩展,其extension Collection where Iterator.Element: TextRepresentable { //... } Iterator.Element。查看文档,我们发现Array符合MutableCollection,它继承自TextRepresentable。因此,Collection间接符合Array。您的 Collection数组是hamsters(因此是Array),其元素为Collection。由于HamsterHamster,因此您的TextRepresentable数组有资格接收此扩展程序。

现在让我们来看看这个扩展程序给我们的内容:

hamsters

这是一个名为var textualDescription: String { // ... } 的计算属性,它返回textualDescription。此计算属性适用于所有符合此扩展条件的类型。深入研究它的工作原理:

String

使用map(_:)将此集合的项目转换为let itemsAsText = self.map { $0.textualDescription } Array。在您的示例中,textualDescription已映射到[Hamster(name: "Murray"), Hamster(name: "Morgan"), Hamster(name: "Maurice")]Array

["Murray", "Morgan", "Maurice"]

然后,所有这些文字说明都由return "[" + itemsAsText.joined(separator: ", ") + "]" 加入以生成字符串:, "

然后将其与"Murray", "Morgan", "Maurice"[包装在一起以生成最终结果字符串:]

如果您有任何后续问题,请与我们联系。