【问题标题】:Swift 3.0: Type 'RLMResults<RLMObjectType>' does not conform to protocol 'Sequence'Swift 3.0:类型“RLMResults<RLMObjectType>”不符合协议“序列”
【发布时间】:2016-07-25 05:40:42
【问题描述】:

我看到了:

类型RLMResults&lt;RLMObjectType&gt;不符合协议Sequence

在转换为 Swift 3 时。我正在寻找适用于 Swift 3.0 的 Realm 版本,但是我找不到合适的版本,甚至找不到分支。

我试图写一个扩展,但仍然是同样的错误信息:

extension RLMResults: Sequence
{
    public func makeIterator() -> RLMResults.Iterator
    {
        return NSFastEnumerationIterator(self)
    }
}

我该如何修复它,或者在哪里可以找到合适的框架或分支?

更新: 需要Sequence协议的代码:

public class RealmChartUtils: NSObject
{
    /// Transforms the given Realm-ResultSet into an xValue array, using the specified xValueField
    public static func toXVals(results: RLMResults<RLMObject>, xValueField: String) -> [String]
    {
        let addedValues = NSMutableSet()
        var xVals = [String]()

        for object in results // <-- here needs Sequence protocol
        {
            let xVal = (object as! RLMObject)[xValueField] as! String!
            if !addedValues.contains(xVal!)
            {
                addedValues.add(xVal!)
                xVals.append(xVal!)
            }
        }

        return xVals
    }
}

所以在 swift 2.2 中,我们在上面的函数之后添加了如下扩展:

extension RLMResults: SequenceType
{
    public func generate() -> NSFastGenerator
    {
        return NSFastGenerator(self)
    }
}

extension RLMArray: SequenceType
{
    public func generate() -> NSFastGenerator
    {
        return NSFastGenerator(self)
    }
}

所以在 Xcode 8 beta 3 中,它说 SequenceType 重命名为 Sequence,但这是最初的问题,因为我试图使上述扩展符合 Sequence(这是我第一个发布的扩展),编译器一直说Type RLMResults&lt;RLMObjectType&gt; does not conform to protocol Sequence

我可以在不升级 Realm swift 框架的情况下解决这个问题吗(我宁愿等待发布,而不是此时自行构建 master 分支)

【问题讨论】:

    标签: realm swift3


    【解决方案1】:

    如何让RLMResults 符合Sequence

    请参阅Using Realm Objective-C from Swift 了解如何使 Realm Objective-C 的类型在 Swift 中更自然地工作。特别要注意RLMSupport.swift的部分:

    我们建议您编译 Swift/RLMSupport.swift 文件(也可以在我们的发行版 zip 中找到)。

    此文件将 SequenceType 一致性添加到 Realm Objective-C 集合类型中,并重新公开无法从 Swift 原生访问的 Objective-C 方法,例如包括可变参数在内的方法。

    Realm Objective-C 默认不包含此文件,因为这将迫使所有 Realm Objective-C 用户包含大量的 Swift 动态库,无论他们是否在其应用中使用 Swift!

    但是,由于a bug in the Swift 3 compilerRLMResultsRLMArraySequence 的一致性已被暂时禁用。希望 Swift 编译器问题能够在 Xcode 8 退出测试版之前得到解决。

    在哪里可以找到支持 Swift 3 的 Realm?

    Realm 的 master 分支上支持 Swift 3 和 Realm Swift 以及对 Swift 2 的现有支持。一旦 Xcode 8 和 Swift 3 最终确定,它将在今年晚些时候在 Realm Swift 版本中提供。

    【讨论】:

    • 这是一个纯 swift 项目,有什么办法可以摆脱这个错误吗?
    • 我没有看到您关于 RLMSupport 的回答可以解决问题。
    • 如果是纯 Swift 项目,为什么要使用 Realm Objective-C? Realm Swift 提供了一个符合您期望开箱即用的 Swift 协议的接口。 RLMSupport.swift 为使用 Swift 的 Realm Objective-C 的项目提供相同的功能,这通常仅在混合 Obj-C / Swift 项目中有用。
    • 嗯,这是一个在 github 上名为 Charts 的开源项目。它的库是用 swift 编写的,但是,有使用 Objective-C 的演示。我正在开发 swift 3.0 分支,为开发人员提供一个测试 iOS 10 的分支,但是,我无法通过编写符合 Sequence 协议的扩展来摆脱这个错误
    • 您能否解释一下为什么您认为 RLMSupport.swift 不能解决您的问题?
    猜你喜欢
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多