我的应用程序有一个用于详细视图控制器的协议,指出它们必须具有一个viewModel
属性:
protocol DetailViewController: class {
var viewModel: ViewModel? {get set}
}
我也有一些实现协议的不同类:
class FormViewController: UITableViewController, DetailViewController {
// ...
}
class MapViewController: UIViewController, DetailViewController {
// ...
}
我的主视图控制器需要一个可以设置为UIViewController
实现该DetailViewController
协议的任何子类的属性。
不幸的是,我找不到有关如何执行此操作的任何文档。在Objective-C中,这是微不足道的:
@property (strong, nonatomic) UIViewController<DetailViewController>;
看来,Swift中没有可用的语法来做到这一点。我最接近的是在类定义中声明一个泛型:
class MasterViewController<T where T:UIViewController, T:DetailViewController>: UITableViewController {
var detailViewController: T?
// ...
}
但是然后我得到一个错误,说“类’MasterViewController’没有实现其超类的必需成员”
在Swift中似乎应该像在Objective-C中一样容易,但是我在任何地方都找不到任何建议可以解决该问题的方法。
从Swift 4开始,您现在可以执行此操作。
Swift 4实现了SE-0156(类和子类型存在)。
等效于此Objective-C语法:
@property (strong, nonatomic) UIViewController<DetailViewController> * detailViewController;
现在在Swift 4中看起来像这样:
var detailViewController: UIViewController & DetailViewController
本质上,您需要定义一个变量符合的类,以及它实现的N种协议。有关更多详细信息,请参见链接的文档。
问题内容: 在Swift中,我可以通过声明如下来显式设置变量的类型: 如果我们想更进一步,并声明一个符合多种协议的变量,可以使用声明式: 如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象,该怎么办?等效的Objective-C看起来像这样: 在Swift中,我希望它看起来像这样: 这使我们能够灵活处理基本类型的实现以及协议中定义的添加接口。 还有其他更明显的方式可能会让我丢失吗? 例
问题内容: 可以说我已经创建了这个协议和几个类 现在,我想声明一个数组,其中包含符合此类协议的对象类。我该如何申报?理想情况下,我希望编译器检查数组(在编译时)是否正确填充,而不是自己在运行时(运行时)检查它。 这是我尝试的没有成功的方法:( 这会导致编译错误: ‘任何对象都没有名为’construct’的成员 由于类本身不符合协议(它们的实例符合),因此编写这种方法甚至更糟。 类型“ MyCon
问题内容: 假设我有一个协议: 这是实现 我的期望是我必须能够使用变量来打印这样的值: 编译器抱怨此错误: “协议’Printable’只能用作一般约束,因为它具有Self或关联的类型要求” 难道我做错了什么 ?有任何解决这个问题的方法吗 ? 编辑2:我想要的真实世界的例子。请注意,这不会编译,但是会介绍我想要实现的目标。 问题答案: 正如Thomas所指出的,您可以通过根本不提供类型来声明变量(
问题内容: 在Objective-C中,您可以将类型定义为给定类并实现协议: 这将表明返回的值是实现给定协议的值。有没有办法在Swift中执行类似的操作? 问题答案: 您可以这样做: 这定义了一个函数,该函数返回类型为“SomeType”和协议“SomeProtocol”的对象,并返回符合这些条件的对象。
问题内容: 在下面的代码中,我想测试是否为。如果是的话,我想作为。你怎么做到这一点?如果不使用强制转换,则使用其他技术。 那里的最后一行不会编译。错误是: 协议“ SpecialController”仅具有通用要求或关联类型要求,因此只能用作通用约束。 问题答案: 不幸的是,Swift当前不支持将具有关联类型的协议用作实际类型。但是,从技术上讲这对于编译器是可行的。并且很可能在该语言的未来版本中实
我为协变返回类型的继承创建了一个小示例。基本上有三种不同的类别: 主应用程序: BaseManager: 鸟经理: 当我重写方法以返回时,为什么我需要将类型转换为? 我使用过的重写方法在返回类型上会有所不同吗?作为参考。 编辑: 我有不同的子模型,它们都继承自。所有模型都允许存在一次。我尝试将这些模型添加到列表中,而不是对每个模型使用单例。使用,我想得到实际的模型。也许我得考虑太多了。