在Objective-C中,可以编写如下代码:
@property(retain) UIView<Protocol1, Protocol2, ...> *myView;
但是如何快速编写此代码?
我已经知道如何使一个属性符合许多协议,但是使用继承不能正常工作:
var myView: ??? protocol<Protocol1, Protocol2, ...>
编辑:
我用许多UIView
亚型像UIImageView
,UILabel
或别人,我需要使用一些的UIView
属性加在协议定义的一些方法。在最坏的情况下,我可以UIViewProtocol
使用所需的属性创建一个,但是我想知道在Swift中是否可以使用类型和某种协议来声明一个属性/变量。
您可以使用where子句对通用类进行此操作:
使用where子句可以要求关联的类型符合某种协议,并且/或者某些类型的参数和关联的类型必须相同。
若要使用它,请在具有类型约束的泛型类中定义您的属性类,以检查属性的type参数是否与所需的基类和协议相匹配。
对于您的特定示例,它可能看起来像这样:
class MyViewController<T where T: UIView, T: Protocol1, T: Protocol2>: UIViewController {
var myView: T
// ...
}
问题内容: 我有一个符合多种协议的Objective-C变量。 我将如何在Swift中代表这种类型? 问题答案: 这应该工作: 注意,必须快速使用NSObjectProtocol而不是NSObject。 以下是一些其他示例: 符合多种协议的对象数组: 具有符合多种协议的参数的功能: 对于3.1之前的Swift版本,请使用:
问题内容: 我想创建一个具有某种类型并且也符合协议的属性,就像我在Objective-C中所做的那样: 我要寻找的是指定可以使用也符合CustomProtocol的UIViewController类型的对象设置属性,以便清楚什么是基类。我知道我可以只使用短类存根来获得相同的结果,即 但这似乎不是最干净的方法。 问题答案: 我想不出一种在Swift中表达这一点的好方法。类型的语法是: 类型→数组类型
问题内容: 我试图在我快速编写的类上使用NSCoding协议,但是似乎无法弄清楚为什么当我实现所需的方法时,编译器会抱怨它“不符合协议NSCoding”: 这是一个错误还是我只是缺少一些东西? 问题答案: 如您在报告导航器中详细的编译器消息中所见,您的方法未正确声明: (在beta版本之间可能有所变化。)此外,该方法必须标记为: 在 Swift 3中 ,所需的方法是
问题内容: 在Swift中,我可以通过声明如下来显式设置变量的类型: 如果我们想更进一步,并声明一个符合多种协议的变量,可以使用声明式: 如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象,该怎么办?等效的Objective-C看起来像这样: 在Swift中,我希望它看起来像这样: 这使我们能够灵活处理基本类型的实现以及协议中定义的添加接口。 还有其他更明显的方式可能会让我丢失吗? 例
问题内容: 尝试符合Swift UIViewController子类中的UITableViewDataSource和UITableViewDelegate。 文件说,你应该在符合行后但那通常在超去。另一个不起作用。在超类之后使用逗号分隔的列表也不起作用 编辑: 还必须采用每种协议的所有必需方法,而我最初并未这样做。 问题答案: 您使用逗号: 但是要意识到,超类必须是逗号分隔列表中的第一项。 如果您
问题内容: 在Objective-C中: 在Swift中: 但是,将出现一条错误消息: 类型“ CellDatasDataSource”不符合协议“ NSObjectProtocol” 类型“ CellDatasDataSource”不符合协议“ UITableViewDataSource” 正确的方法应该是什么? 问题答案: 类型“ CellDatasDataSource”不符合协议“ NSOb