iOS swift : Protocol and Types

标签 ios swift protocols

我在编写协议(protocol)和执行它的默认实现时遇到问题。

协议(protocol)是 RealmServiceCompatible,对象应该遵守它。 在扩展 RealmServiceCompatible 中,我给出了它的默认实现,但是当我使 Object 符合它时,Xcdoe 仍然要求我编译协议(protocol) stub ..

我无法找出正确的语法。

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 (实现协议(protocol)的类的类型)。但你的协议(protocol)适用于所有可能的CompatibleType值。

也就是说,我上次检查时,在任何情况下都不能执行此操作(即使您确保处理所有可能的 CompatibleType 值),因为您进入了循环定义。默认实现仅适用于已经符合的事物,但除非它们有实现,否则它们并不符合。原则上,类型检查器可能会退一步说(就像人类所做的那样),“让我们假装它确实符合,即使它还没有,看看通过假装符合它是否真的神奇地确实如此,”但我认为类型检查器今天不会这样做。 (在一般情况下,这实际上是一个相当困难的问题,并且可能会大大增加编译时间,以追寻所有可能的解决方式。)

目前还不清楚你想在这里做什么,因为 RealmServiceCompatible似乎没有拉任何重量。我怀疑你正在尝试做类似 make SomeClass().rs 的事情返回RealmService<SomeClass> ,而SomeSubClass().rs返回RealmService<SomeSubClass> ,但这在 Swift 中是不可能的。 RealmService<SomeSubClass>不是 RealmService<SomeClass> 的子类型因为 Swift 缺乏表达协变的方法,所以这会破坏继承。

感觉就像你试图在这里创造一些神奇的东西,但行不通。

关于iOS swift : Protocol and Types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54062696/

相关文章:

ios - 以正确的格式在控制台中显示 unicode

ios - 即使我使用了 AppGroup,我的 Iwatch 也无法获取从 ios 应用程序保存的数据

swift - 有没有比嵌套循环更好的方法?

ios - swift ;来自 UNUserNotificationCenter 的 HTTP 请求不起作用 : The Internet connection appears to be offline

ios - 将字符串从第二个 View Controller 传递到第一个 Controller

ios - 为什么在 UIScrollView 中将 pagingEnabled 设置为 YES 会在触摸 subview 时自动滚动到上一页?

c++ - iOS:将 Qt 添加到现有的 Xcode 项目

ios - 将 UIImage 大小与 pdf 大小匹配

swift - 必须指定 Swift 协议(protocol)中的初始化程序。为什么呢?

clojure - 为什么在导入 Clojure 协议(protocol)时出现 IllegalArgumentException "interface is not a protocol"?