有条件地符合 Set 到 ExpressibleByDictionaryLiteral 协议
Conditionally conform Set to ExpressibleByDictionaryLiteral protocol
protocol Weighted: Hashable {
associatedtype D: Hashable
associatedtype W: Hashable
var destination: D { get }
var weight: W { get }
init(destination: D, weight: W)
}
方法一
// 已编辑------------
@Dávid Pásztor 已经回答了这部分问题,所以我删除了它,以便为更有趣的第二部分腾出空间。
// ----------------------
方法二
extension ExpressibleByDictionaryLiteral where Self: Collection, Element: Weighted {
init(dictionaryLiteral elements: (Element.D, Element.W)...) {
Self.init(elements.map(Element.init))
}
}
此代码编译通过。但下一行没有:
extension Set: ExpressibleByDictionaryLiteral where Element: Weighted {}
Type 'Set' does not conform to protocol
'ExpressibleByDictionaryLiteral'
我不明白为什么它不符合协议。看来它应该在这个阶段符合。
加分题
extension ExpressibleByDictionaryLiteral where Self: Collection, Element: Weighted {
如何让它不扩展到所有集合,而只扩展到集合?
您只需要制作 Weighted
协议 public
以及标记初始化 public
。
public protocol Weighted: Hashable {
associatedtype D: Hashable
associatedtype W: Hashable
var destination: D { get }
var weight: W { get }
init(destination: D, weight: W)
}
extension Set: ExpressibleByDictionaryLiteral where Element: Weighted {
public init(dictionaryLiteral elements: (Element.D, Element.W)...) {
self.init(elements.map(Element.init))
}
}
protocol Weighted: Hashable {
associatedtype D: Hashable
associatedtype W: Hashable
var destination: D { get }
var weight: W { get }
init(destination: D, weight: W)
}
方法一
// 已编辑------------
@Dávid Pásztor 已经回答了这部分问题,所以我删除了它,以便为更有趣的第二部分腾出空间。
// ----------------------
方法二
extension ExpressibleByDictionaryLiteral where Self: Collection, Element: Weighted {
init(dictionaryLiteral elements: (Element.D, Element.W)...) {
Self.init(elements.map(Element.init))
}
}
此代码编译通过。但下一行没有:
extension Set: ExpressibleByDictionaryLiteral where Element: Weighted {}
Type 'Set' does not conform to protocol 'ExpressibleByDictionaryLiteral'
我不明白为什么它不符合协议。看来它应该在这个阶段符合。
加分题
extension ExpressibleByDictionaryLiteral where Self: Collection, Element: Weighted {
如何让它不扩展到所有集合,而只扩展到集合?
您只需要制作 Weighted
协议 public
以及标记初始化 public
。
public protocol Weighted: Hashable {
associatedtype D: Hashable
associatedtype W: Hashable
var destination: D { get }
var weight: W { get }
init(destination: D, weight: W)
}
extension Set: ExpressibleByDictionaryLiteral where Element: Weighted {
public init(dictionaryLiteral elements: (Element.D, Element.W)...) {
self.init(elements.map(Element.init))
}
}