繁体   English   中英

iOS Swift:协议和类型

[英]iOS Swift: Protocol and Types

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

该协议是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
}

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

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

仅当CompatibleType == Self (实现协议的类的类型)时才相关。 但是您的协议适用于所有可能的CompatibleType值。

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

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

感觉就像您在尝试制作一些无法使用的神奇东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM