class Dog: Object,Animal { dynamic var name = ""}class Cat: Object,Animal { dynamic var name = ""}protocol Animal { var name: String { get }}
在这种情况下,我创建了两个模型类和一个协议.
但是,当我转移到实现时,问题就出现了.下面的代码是在视图控制器中编写的:
var dogs: Results<Dog>? { return try! Realm().objects(Dog)}var cats: Results<Cat> { return try! Realm().objects(Cat)}
这段代码没有任何问题.但是下面的代码:
var animals: Results<Animal>? { switch currentSegmented { // this is from UISegmentedControl case .Cat: // this is from enum return self.cats case .Dog: return self.dogs}
未编译错误:结果要求Animal继承自Object.
但是,Animal是一个协议,因此不能从Object继承.
这里仍然可以使用协议吗?
解决方法 我不认为有一个很好的解决方案. Swift中用户定义的泛型是不变的,所以即使Animal是一个类,你也无法转换结果< Dog>结果< Animal>.令人不快的详细解决方案是围绕不同类型的结果创建一个显式的包装器类型:
enum AnimalResultsEnum { case DogResults(dogs: Results<Dog>) case CatResults(cats: Results<Cat>)}class AnimalResults { var animals = AnimalResultsEnum.DogResults(dogs: try! Realm().objects(Dog)) var realm: Realm? { switch animals { case .DogResults(let dogs): return dogs.realm case .CatResults(let cats): return cats.realm } } var count: Int { switch animals { case .DogResults(let dogs): return dogs.count case .CatResults(let cats): return cats.count } } subscript(index: Int) -> Animal { switch animals { case .DogResults(let dogs): return dogs[index] case .CatResults(let cats): return cats[index] } } // ... wrap the rest of the methods needed ...}
你可以通过创建一个半类型擦除容器来包装结果来制作这个通用:
class CovariantResults<T: Object> { private var base: _CovariantResultsBase<T> init<U: Object>(_ inner: Results<U>) { base = _CovariantResultsImpl<T,U>(inner) } subscript(index: Int) -> T { return base[index] } // ... wrap the rest of the methods needed ...}class _CovariantResultsBase<T: Object> { subscript(index: Int) -> T { fatalError("abstract") } // ... wrap the rest of the methods needed ...}class _CovariantResultsImpl<T: Object,U: Object>: _CovariantResultsBase<T> { private let impl: Results<U> init(_ inner: Results<U>) { impl = inner } overrIDe subscript(index: Int) -> T { return impl[index] as! T } // ... wrap the rest of the methods needed ...}// Used as:let animals = CovariantResults<Animal>(try! Realm().objects(Dog))总结
以上是内存溢出为你收集整理的ios – 我可以使用Realm Results类将协议用作泛型吗?全部内容,希望文章能够帮你解决ios – 我可以使用Realm Results类将协议用作泛型吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)