我得到了这个协议和实现它的结构。
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)
答案 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
})。
如果是Collection
(Array
是Collection
)的情况,则扩展程序会将计算属性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
。由于Hamster
为Hamster
,因此您的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"
和[
包装在一起以生成最终结果字符串:]
如果您有任何后续问题,请与我们联系。