我想创建一个具有某种类型并且也符合协议的属性,就像我在Objective-C中所做的那样:
@property (nonatomic) UIViewController<CustomProtocol> *controller;
我要寻找的是指定可以使用也符合CustomProtocol的UIViewController类型的对象设置属性,以便清楚什么是基类。我知道我可以只使用短类存根来获得相同的结果,即
class CustomViewController : UIViewController, CustomProtocol {}
但这似乎不是最干净的方法。
我想不出一种在Swift中表达这一点的好方法。类型的语法是:
类型→数组类型| 字典类型| 功能类型| 类型标识符| 元组类型| 可选类型| 隐式展开的可选类型| 协议组成类型| 元型
您正在寻找的是一种也可以接受基类的 协议组合类型 。( 协议组合类型 为protocol<Proto1, Proto2, Proto3, …>
。)但是,当前这是不可能的。
允许具有相关类型要求的协议具有指定所需的基类和所需协议的类型别名,但是这些也要求在编译时就知道类型,因此对于您而言,这不太可能是一个可行的选择。
如果您真的很喜欢它,则可以UIViewController
使用所用接口的一部分定义协议,使用扩展名添加一致性,然后使用protocol<UIViewControllerProtocol, CustomProtocol>
。
protocol UIViewControllerProtocol {
func isViewLoaded() -> Bool
var title: String? { get set }
// any other interesting property/method
}
extension UIViewController: UIViewControllerProtocol {}
class MyClass {
var controller: protocol<UIViewControllerProtocol, CustomProtocol>
}
问题内容: 在Objective-C中,可以编写如下代码: 但是如何快速编写此代码? 我已经知道如何使一个属性符合许多协议,但是使用继承不能正常工作: 编辑: 我用许多亚型像,或别人,我需要使用一些的属性加在协议定义的一些方法。在最坏的情况下,我可以使用所需的属性创建一个,但是我想知道在Swift中是否可以使用类型和某种协议来声明一个属性/变量。 问题答案: 您可以使用where子句对通用类进行此
问题内容: 在Objective-C中: 在Swift中: 但是,将出现一条错误消息: 类型“ CellDatasDataSource”不符合协议“ NSObjectProtocol” 类型“ CellDatasDataSource”不符合协议“ UITableViewDataSource” 正确的方法应该是什么? 问题答案: 类型“ CellDatasDataSource”不符合协议“ NSOb
问题内容: 我有一个带有1个可选字段和1个非可选字段的类,它们都具有Type AnotherClass 类型,并且还符合 CustomProtocol : 现场 nonoptionalField 的类型 AnotherClass 和符合 CustomProtocol 。 另一方面, optionalField 实际上是 Optional ,因此不符合 CustomProtocol : 如何解开 o
问题内容: 尝试符合Swift UIViewController子类中的UITableViewDataSource和UITableViewDelegate。 文件说,你应该在符合行后但那通常在超去。另一个不起作用。在超类之后使用逗号分隔的列表也不起作用 编辑: 还必须采用每种协议的所有必需方法,而我最初并未这样做。 问题答案: 您使用逗号: 但是要意识到,超类必须是逗号分隔列表中的第一项。 如果您
问题内容: 我有一个符合多种协议的Objective-C变量。 我将如何在Swift中代表这种类型? 问题答案: 这应该工作: 注意,必须快速使用NSObjectProtocol而不是NSObject。 以下是一些其他示例: 符合多种协议的对象数组: 具有符合多种协议的参数的功能: 对于3.1之前的Swift版本,请使用:
问题内容: 如何列出在Swift中实现给定协议的所有类? 说我们有一个例子: 这是我当前的(不可编译)方法: 但是当打电话给 要么 要么 导致Xcode错误:无法将类型(Animal.Protocol).Type的值转换为预期的参数类型’Protocol’。 有人设法使这个工作正常吗? 问题答案: 由于您使用的是Objective-C运行时来获取类型自省,因此需要以这种方式添加到代码中: 请注意,