iOS Swift:协议和类型

时间:2019-01-06 14:51:39

标签: ios swift protocols

我在编写协议并对其进行默认实现时遇到问题。

该协议是RealmServiceCompatible,对象应符合该协议。 在扩展RealmServiceCompatible中,我提供了它的默认实现,但是当我将Object与其兼容时,Xcdoe仍然要求我编译协议存根。.

我找不到正确的语法。

protocol RealmServiceCompatible {

    associatedtype CompatibleType

    var rs: RealmService<CompatibleType> { get }
    static var rs: RealmServiceStatic<CompatibleType> { get }
}

extension RealmServiceCompatible {

    public var rs: RealmService<Self> {
        get {
            return RealmService(self)
        }
    }
    public static var rs: RealmServiceStatic<Self> {
        get {
            return RealmServiceStatic(Self.self)
        }
    }
}


extension Object: RealmServiceCompatible {

    var rs: RealmService<NSObject> {
        <#code#>
    }


    static var rs: RealmServiceStatic<NSObject> {
        <#code#>
    }

}

Xcode已接受以下内容:

protocol RealmServiceCompatible: AnyObject where CompatibleType: Object {

    associatedtype CompatibleType

    var rs: RealmService<CompatibleType> { get }
    static var rs: RealmServiceStatic<CompatibleType> { get }
}

extension RealmServiceCompatible {

    var rs: RealmService<Self> {
            return RealmService(self)
    }
    static var rs: RealmServiceStatic<Self> {
            return RealmServiceStatic(Self.self)
    }
}


extension Object: RealmServiceCompatible {
    typealias CompatibleType = Object
}

1 个答案:

答案 0 :(得分:0)

您没有提供适用的默认实现:

public var rs: RealmService<Self> { ... }

这仅在CompatibleType == Self(实现协议的类的类型)时才有意义。但是您的协议适用于所有可能的CompatibleType值。

也就是说,我上次检查时,无论如何都无法执行此操作(即使您确保处理所有可能的CompatibleType值也是如此),因为您已经获得了循环定义。默认实现仅适用于已经合规的事物,但除非具有实现,否则它们不合规。原则上,类型检查器可以退后一步说(就像人类所做的那样),“让我们假装它确实符合了,即使还不符合,并通过假装真正地神奇地对其进行了验证。确实如此。”但我认为类型检查器今天不会这样做。 (在一般情况下,这实际上是一个非常棘手的问题,可能会增加编译时间,以追逐所有可能解决问题的方法。)

目前还不清楚您要在这里做什么,因为RealmServiceCompatible似乎并没有发挥任何作用。我怀疑您正在尝试使SomeClass().rs返回RealmService<SomeClass>,而SomeSubClass().rs返回RealmService<SomeSubClass>的情况,但这在Swift中是不可能的。 RealmService<SomeSubClass>不是RealmService<SomeClass>的子类型,因为Swift缺乏表达协方差的方法,因此这会破坏继承。

感觉就像您在尝试使神奇的东西无法正常工作。