gpt4 book ai didi

ios - swift 3 : Is there a way to cast an object to a class and protocol at the same time?

转载 作者:行者123 更新时间:2023-11-30 10:42:15 25 4
gpt4 key购买 nike

我已经阅读了 Apple 的 Swift iBook(类型转换和协议(protocol))的相关部分,但我似乎找到了一种方法来指定对象是符合特定协议(protocol)的特定类的实例。

tableView(_: , cellForRowAt: ) 为例我想转换 tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) 返回的单元格作为 UITableViewCell 的子类符合 RLMEntityCapableCell协议(protocol)(仅指定符合者有一个名为 item 的变量,它是 Object 或其子类之一的实例)。

这条路线有效,但双重类型转换似乎过多:

protocol RLMEntityCapableCell: class  {
var item: Object { get set }
}

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) as! RLMEntityCapableCell // Cast here so we can set item
cell.item = items[indexPath.row]
return cell as! UITableViewCell // Cast again so the return type is right…
}

另一种方法:

var cell = tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) 
as! RLMEntityCapableCell, UITableViewCell

给出这个错误:

type annotation missing in pattern

很明显这也不是正确的方法。

我更愿意指定,为了符合协议(protocol),对象必须继承自 UITableViewCellUICollectionViewCell但协议(protocol)的基础只能限于类类型,不能再进一步。

编辑:

这里的想法是为 Realm 对象提供一个通用数据源,它利用泛型,就像 Array 一样。和Dictionary做。每个 TableView 中使用的单元格将特定于要显示的实体,但数据源只知道该单元格将是 UITableViewCell 的子类。符合 RLMEntityCapableCell 。所有数据源需要担心的是告诉单元格需要显示什么实例(它始终是 Object 的子类),单元格将从那里获取它并根据需要自行配置。

最佳答案

不,这不可能......

下一个 Swift 版本(版本 4)可能会带来您正在寻找的新功能,名为 Class and Subtype Existentials :

This proposal brings more expressive power to the type system by allowing Swift to represent existentials of classes and subtypes which conform to protocols.

The proposal keeps the existing & syntax but allows one of the elements to be either AnyObject or of class type (e.g., SomeClass & SomeProtocol).

然后你可以说:

var cell = tableView.dequeueReusableCell(withIdentifier: reuseID, for: indexPath) 
as! UITableViewCell & RLMEntityCapableCell

但是,当然,您将无法使用它向 RLMEntityCapableCell 协议(protocol)添加父类(super class)要求(正如您最初希望的那样)。我们可能需要等待 Swift 5 的到来:)

<小时/>

使用上述类和子类型存在 (Swift 4) 功能的一些其他示例:

protocol P {}
struct S {}
class C {}
class D : P {}
class E : C, P {}

let u: S & P // Compiler error: S is not of class type
let v: C & P = D() // Compiler error: D is not a subtype of C
let w: C & P = E() // Compiles successfully

和:

protocol P {}
class C {}
class D : C { }
class E : C { }
class F : D, P { }

let t: C & D & P = F() // Okay: F is a subclass of D and conforms to P
let u: D & P = t // Okay: D & P is equivalent to C & D & P
let v: C & D & P = u // Okay: C & D & P is equivalent to D & P
let w: D & E & P // Compiler error: D is not a subclass of E or vice-versa

关于ios - swift 3 : Is there a way to cast an object to a class and protocol at the same time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56544885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com