在Swift中,我可以通过声明如下来显式设置变量的类型:
var object: TYPE_NAME
如果我们想更进一步,并声明一个符合多种协议的变量,可以使用protocol
声明式:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象,该怎么办?等效的Objective-C看起来像这样:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
在Swift中,我希望它看起来像这样:
var object: TYPE_NAME,ProtocolOne//etc
这使我们能够灵活处理基本类型的实现以及协议中定义的添加接口。
还有其他更明显的方式可能会让我丢失吗?
例如,假设我有一家UITableViewCell
工厂负责返回符合协议的单元。我们可以轻松地设置一个泛型函数来返回符合协议的单元格:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
稍后我想在利用类型和协议的同时使这些单元出队
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
由于表视图单元格不符合协议,因此返回错误。
我想能够指定单元格是a UITableViewCell
并符合MyProtocol
变量声明中的?
如果您熟悉工厂模式,那么在能够返回实现特定接口的特定类的对象的背景下,这将是有意义的。
就像在我的示例中一样,有时我们希望定义在应用于特定对象时有意义的接口。我关于表格视图单元格的示例就是这样一种证明。
尽管提供的类型与所提到的接口不完全一致,但是工厂返回的对象却与之一致,所以我希望在与基类类型和声明的协议接口交互时具有灵活性
在Swift 4中,现在可以声明一个变量,该变量是类型的子类,并且可以同时实现一个或多个协议。
var myVariable: MyClass & MyProtocol & MySecondProtocol
要执行可选变量:
var myVariable: (MyClass & MyProtocol & MySecondProtocol)?
或作为方法的参数:
func shakeEm(controls: [UIControl & Shakeable]) {}
苹果在WWDC 2017
大会402上宣布了这一点:Swift的新增功能
第二,我想谈谈组成类和协议。因此,在这里,我为UI元素引入了这种可晃动的协议,该协议可以给人一点震动效果,从而引起人们的注意。而且,我继续并扩展了一些UIKit类,以实际提供此震动功能。现在,我想写一些看起来很简单的东西。我只想编写一个函数,该函数需要一堆可摇晃的控件,并摇晃那些能够引起人们注意的控件。我可以在此数组中写什么类型?这实际上是令人沮丧和棘手的。因此,我可以尝试使用UI控件。但并非所有UI控件在此游戏中都是可摇晃的。我可以尝试可Shakable,但并非所有可Shakable都是UI控件。实际上,在Swift
3中没有很好的方式来表示这一点。 Swift 4引入了用任意数量的协议组成一个类的概念。
问题内容: 在Objective-C中,可以编写如下代码: 但是如何快速编写此代码? 我已经知道如何使一个属性符合许多协议,但是使用继承不能正常工作: 编辑: 我用许多亚型像,或别人,我需要使用一些的属性加在协议定义的一些方法。在最坏的情况下,我可以使用所需的属性创建一个,但是我想知道在Swift中是否可以使用类型和某种协议来声明一个属性/变量。 问题答案: 您可以使用where子句对通用类进行此
问题内容: 我有一个符合多种协议的Objective-C变量。 我将如何在Swift中代表这种类型? 问题答案: 这应该工作: 注意,必须快速使用NSObjectProtocol而不是NSObject。 以下是一些其他示例: 符合多种协议的对象数组: 具有符合多种协议的参数的功能: 对于3.1之前的Swift版本,请使用:
问题内容: 可以说我已经创建了这个协议和几个类 现在,我想声明一个数组,其中包含符合此类协议的对象类。我该如何申报?理想情况下,我希望编译器检查数组(在编译时)是否正确填充,而不是自己在运行时(运行时)检查它。 这是我尝试的没有成功的方法:( 这会导致编译错误: ‘任何对象都没有名为’construct’的成员 由于类本身不符合协议(它们的实例符合),因此编写这种方法甚至更糟。 类型“ MyCon
问题内容: 在Objective-C中: 在Swift中: 但是,将出现一条错误消息: 类型“ CellDatasDataSource”不符合协议“ NSObjectProtocol” 类型“ CellDatasDataSource”不符合协议“ UITableViewDataSource” 正确的方法应该是什么? 问题答案: 类型“ CellDatasDataSource”不符合协议“ NSOb
问题内容: 我的应用程序有一个用于详细视图控制器的协议,指出它们必须具有一个属性: 我也有一些实现协议的不同类: 我的主视图控制器需要一个可以设置为实现该协议的任何子类的属性。 不幸的是,我找不到有关如何执行此操作的任何文档。在Objective-C中,这是微不足道的: 看来,Swift中没有可用的语法来做到这一点。我最接近的是在类定义中声明一个泛型: 但是然后我得到一个错误,说“类’Master
问题内容: 如何列出在Swift中实现给定协议的所有类? 说我们有一个例子: 这是我当前的(不可编译)方法: 但是当打电话给 要么 要么 导致Xcode错误:无法将类型(Animal.Protocol).Type的值转换为预期的参数类型’Protocol’。 有人设法使这个工作正常吗? 问题答案: 由于您使用的是Objective-C运行时来获取类型自省,因此需要以这种方式添加到代码中: 请注意,