swift - 使核心数据类成为最终类以满足协议(protocol) 'Self' 要求

标签 swift core-data final self swift-protocols

我编写了一个协议(protocol),允许将简单链中的对象与前任和后继链接起来。

我正在尝试将此协议(protocol)与我的核心数据实体“事件”一起使用,但出现此错误:

错误:

Protocol 'Chainable' requirement 'chain' cannot be satisfied by a non-final class ('Event') because it uses 'Self' in a non-parameter, non-result type position.

我怎样才能让这个类final(我不想将 Codegen 设置为手动),或者重写 var 链: [Self] 定义?

提前谢谢你。

extension Event: Chainable {}

protocol Chainable where Self: NSManagedObject {

    var chain: [Self] { get }

    var predecessor: Self? { get set }
    var successor: Self? { get set }

    var selfIndexInChain: Int { get }

    mutating func moveInChain(to index: Int)
    mutating func removeSelfFromChain()

    mutating func addSelfAsSuccessor(of object: Self)
    mutating func addSelfAsPredecessor(of object: Self)
}

extension Chainable {
   
    var chain: [Self] {
    
        var _chain: [Self] = [self]
    
        // go right
        var current: Self = self
        while let successor = current.successor {
        
            _chain.append(successor)
            current = successor
        }
    
        // go left
        current = self
        while let predecessor = current.predecessor {
        
            _chain.insert(predecessor, at: 0)
            current = predecessor
        }
    
        // TODO: - Compare speed with the alternative realization: Find the first element, then populate the tasks array.
    
        return _chain
    }

    // Self Index in the chain
    var selfIndexInChain: Int { return self.chain.index(of: self)! }


    // Change place in the cahain
    mutating func moveInChain(to index: Int) {
    
        guard index != selfIndexInChain else { return } // Check the index isn't same
        guard 0...(chain.count-1) ~= index else { return }
    
        let taskAtDestination = chain[index]
    
        if index > selfIndexInChain {
        
            removeSelfFromChain()
            addSelfAsSuccessor(of: taskAtDestination)
       } else {
            removeSelfFromChain()
            addSelfAsPredecessor(of: taskAtDestination)
       }
    }

    mutating func removeSelfFromChain() {
    
        let successor = self.successor
        let predecessor = self.predecessor
    
        self.predecessor = nil
        self.successor = nil
    
        self.predecessor?.successor = successor
        self.successor?.predecessor = predecessor
    }

    mutating func insertSelfBetween(lhs: Self, rhs: Self) {
        // self shouldn't be linked
        guard self.predecessor == nil && self.successor == nil else { return }
    
        guard (lhs.successor == rhs && rhs.predecessor == lhs) ||
            (lhs.successor == nil && rhs.predecessor == nil ) else { return } // If both are nil, they will be connected thru self
    
        self.predecessor = lhs
        self.successor = rhs
    
    }

    mutating func addSelfAsSuccessor(of object: Self) {
        // self shouldn't be linked
        guard self.predecessor == nil && self.successor == nil else { return } // TODO: Add error support
        // self shouldn't be already the successor 
        guard object.successor != self else { return }
    
        let previousSuccessor = object.successor
        self.predecessor = object
        self.successor = previousSuccessor
    
    }

    mutating func addSelfAsPredecessor(of object: Self) {
        // self shouldn't be linked
        guard self.predecessor == nil && self.successor == nil else { return }
        // self shouldn't be the task successor already
        guard object.predecessor != self else { return }
    
        let previousPredecessor = object.predecessor
        self.successor = object
        self.predecessor = previousPredecessor
    }

}

最佳答案

我也遇到了类似的问题。

解决方法:

查看您的代码,似乎 Chainable 将由多个 NSManagedObject 子类实现。

Self 替换为 Chainable 并让 Chainable 包含需要与 NSManagedObject< 通用的最低要求 子类。

在某些情况下,这意味着为 NSManagedObject 子类实现的一些功能实现一个包装器

关于swift - 使核心数据类成为最终类以满足协议(protocol) 'Self' 要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47540219/

相关文章:

swift - 使用 PDFKit - iOS 11 点击注释后触发应用内浏览器

xcode - 如何使用 Xcode for Ubuntu 构建 Swift Perfect Server?

ios - 仅从核心数据中获取所需的数据还是所有数据?

ios - 由于其对关系和继承的不同看法,我很难根据我的类图设计适当的核心数据布局

ios - 核心数据架构

java - 如何从匿名内部类访问非最终变量?

java - 从内部类内部访问 LibGDX 变量

ios - OpenGL 调用中的 Swift EXC_Bad_Access

ios - 动态大小 CollectionViewCells

java - 为什么Java中的接口(interface)变量是隐式静态的?