有条件地符合 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))
    }
}