在Objective-C中,您可以将类型定义为给定类并实现协议:
- (UIView <Protocol> *)someMethod;
这将表明返回的值someMethod
是UIView
实现给定协议的值Protocol
。有没有办法在Swift中执行类似的操作?
您可以这样做:
protocol SomeProtocol {
func someMethodInSomeProtocol()
}
class SomeType { }
class SomeOtherType: SomeType, SomeProtocol {
func someMethodInSomeProtocol() { }
}
class SomeOtherOtherType: SomeType, SomeProtocol {
func someMethodInSomeProtocol() { }
}
func someMethod<T: SomeType where T: SomeProtocol>(condition: Bool) -> T {
var someVar : T
if (condition) {
someVar = SomeOtherType() as T
}
else {
someVar = SomeOtherOtherType() as T
}
someVar.someMethodInSomeProtocol()
return someVar as T
}
这定义了一个函数,该函数返回类型为“SomeType”和协议“SomeProtocol”的对象,并返回符合这些条件的对象。
问题内容: 我有以下代码: 注释行无法编译。 为什么即使协议要求,我也必须强制将协议类型对象强制转换为符合该对象类型的对象? 问题答案: 采用该协议告诉编译器此特定响应,至少不会更多。 在相反的结论,并 没有 成为必然。 如果受影响的类不是,约束只是编译器 在编译时 抱怨的另一信息。 在您的情况下,对编译器进行批注仅知道对作出响应。它不知道类型实际上是的子类。 因此,如果要访问具体类的属性,请不要
问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译
问题内容: 请参见下面的自包含示例。编译器在最后一行(由标记为)报告错误,在该行中,我将实例分配给它(根据我的最佳判断)符合的协议类型。如何编译?我究竟做错了什么?还是这个编译器问题? 编辑: 即使我明确地向下转换了上面的返回类型(以便上面的代码片段的最后一行读取),如安东尼奥在调用函数时仍然存在编译错误: 问题答案: 首先,您想从devforums上读到规范的线程。您特别想跳过阅读jckarte
问题内容: 我的应用程序有一个用于详细视图控制器的协议,指出它们必须具有一个属性: 我也有一些实现协议的不同类: 我的主视图控制器需要一个可以设置为实现该协议的任何子类的属性。 不幸的是,我找不到有关如何执行此操作的任何文档。在Objective-C中,这是微不足道的: 看来,Swift中没有可用的语法来做到这一点。我最接近的是在类定义中声明一个泛型: 但是然后我得到一个错误,说“类’Master
问题内容: 当我们必须创建一个实现类时,松耦合如何与接口相关联?实现类被强制实现接口中定义的所有那些方法。我不明白这怎么允许失去耦合?我是面向对象的程序设计和软件设计的新手,因此,如果您能对这个话题有所了解,将会很有帮助。一个例子将是锦上添花。 问题答案: 关键是接口不仅允许您编写实现该接口的类,还允许您编写多个接口。 当您具有通过使用接口与类进行交互的代码时,该代码可以与实现该接口的任何类一起使
问题内容: 我需要保留Swift元类型的集合并编写一个函数,该函数将检查给定对象是否是其中之一的实例。我可以在Java中轻松做到这一点: 但是,我不知道如何在Swift中做到这一点: 这甚至可以在Swift中完成吗? 问题答案: 不幸的是,您目前只能对运算符使用命名类型,还不能对其使用任意的元类型值(尽管实际上 应该 可以使用IMO )。 假设您可以控制要与之进行比较的元类型的创建,则达到相同结果