如何在协议中设置读写内部,只读外部属性

时间:2019-05-29 06:52:51

标签: ios swift

我有一些类具有相同的行为,它们都具有

属性> savedPath: Stringitems: [String]currentItem: [String]

功能> archive(with items: [String])unarchive()

所以我创建了一个protocol.swift并让这些类符合该协议以实现这些常见行为。但是,就我而言,我想要:

  1. items是外部只读的,内部是可读写的
  2. archive/unarchive是私人功能

我尝试在private(set)之前使用items,在private之前使用archive/unarchive,但出现了一些错误。 有解决此问题的灵活解决方案吗?

在没有协议之前

class SampleClass {
    private(set) var items: [SampleModel] {
        set {
            archive(with: newValue)
        } get {
            return unarchive()
        }
    }

    func archive(with addresses: [SampleModel]) { ... }
    func unarchive() -> [SampleModel] { ... }
}

尝试使用协议满足后

protocol SampleProtocol {
    associatedtype Item: Switchable

    var savedPath: String { get }
    var items: [Item] { get }
    var currentItem: Item? { get }

    func archive(with items: [Item])
    func unarchive() -> [Item]
}

1 个答案:

答案 0 :(得分:2)

您必须从协议中删除任何私有功能(因为它没有意义)。协议(setter,函数等)中没有什么是私有的

protocol SampleProtocol {
    associatedtype Item: Switchable

    var savedPath: String { get }
    var items: [Item] { get }
    var currentItem: Item? { get }
}

然后您应该实现这样的类访问控制:

class SampleClass {
    private(set) var items: [SampleModel] {
        set {
            archive(with: newValue)
        } get {
            return unarchive()
        }
    }

    private func archive(with addresses: [SampleModel]) { /* ... */ }
    private func unarchive() -> [SampleModel] { /* ... */ }
}