协议可以指定只有一个类可以通过使用class其继承列表中的关键字来实现它。此关键字必须出现在此列表中任何其他继承的协议之前。
protocol ClassOnlyProtocol: class, SomeOtherProtocol { // 协议要求 }
如果非类类型尝试实现ClassOnlyProtocol,则会生成编译器错误。
struct MyStruct: ClassOnlyProtocol { // 错误:非类类型“ MyStruct”不符合类协议“ ClassOnlyProtocol” }
其他协议可能继承自ClassOnlyProtocol,但它们具有相同的仅类要求。
protocol MyProtocol: ClassOnlyProtocol { // ClassOnlyProtocol要求 // 我的协议要求 } class MySecondClass: MyProtocol { // ClassOnlyProtocol要求 // 我的协议要求 }
当一致类型未知时,使用仅类协议可以提供参考语义。
protocol Foo : class { var bar : String { get set } } func takesAFoo(foo:Foo) { // 此分配需要参考语义, // 因为foo是在此范围内的let常数。 foo.bar= "new value" }
在此示例中,与Foo仅类协议一样,bar由于编译器知道foo类类型,因此对的分配有效,因此具有引用语义。
如果Foo不是仅基于类的协议,则将产生编译器错误-因为符合类型可能是值类型,因此需要var注释才能使其可变。
protocol Foo { var bar : String { get set } } func takesAFoo(foo:Foo) { foo.bar= "new value" // 错误:无法分配给属性:'foo'是一个'let'常量 }
func takesAFoo(foo:Foo) { var foo = foo // foo的可变副本 foo.bar= "new value" // 没有错误-同时满足引用和值语义 }
将weak修饰符应用于协议类型的变量时,该协议类型必须是仅类的,因为weak只能应用于引用类型。
weak var weakReference : ClassOnlyProtocol?
本文向大家介绍深入解析Swift语言中的协议,包括了深入解析Swift语言中的协议的使用技巧和注意事项,需要的朋友参考一下 协议为方法,属性和其他要求的功能提供了一个蓝本。它只是描述了方法或属性的骨架,而不是实现。方法和属性实现还可以通过定义类,函数和枚举完成。协议的一致性是指方法或属性满足协议的要求。 语法 协议也遵循类似类,结构和枚举的语法: 协议在类,结构或枚举类型命名声明。单个和多个协议的
本文向大家介绍Swift语言函数类型,包括了Swift语言函数类型的使用技巧和注意事项,需要的朋友参考一下 示例 每个函数都有其自己的函数类型,该函数类型由参数类型和函数本身的返回类型组成。例如以下功能: 具有以下功能类型: 因此,函数类型可用作嵌套函数的参数类型或返回类型。
问题内容: 有没有一种方法可以用Swift语言创建抽象类,还是像Objective-C一样有局限性?我想创建一个与Java定义的抽象类相当的抽象类。 问题答案: Swift中没有抽象类(就像Objective- C一样)。最好的选择是使用Protocol,就像Java接口一样。 然后,借助Swift 2.0,您可以使用协议扩展添加方法实现和计算的属性实现。唯一的限制是您 不能提供成员变量或常量 ,
问题内容: 如何在Swift语言中实现反射? 如何实例化课程 问题答案: 请注意,Swift类现在已命名为名称空间,因此它将是“ AppName.MyViewController”而不是“ MyViewController” 从XCode6-beta 6/7开始不推荐使用 使用XCode6-beta 3开发的解决方案 多亏了Edwin Vermeer的回答,我能够通过执行以下操作来构建一些东西来将
来自Apple book“结构和类之间最重要的区别之一是,当结构在代码中传递时,它们总是被复制,而类是通过引用传递的。” 有谁能帮我明白那是什么意思吗?对我来说,类和结构似乎是一样的。
问题内容: 我有两个控制器,我需要调用第一个控制器到第二个控制器的功能:在第二个控制器中,我在类中创建了协议和初始化委托: 第一控制人 但是函数没有被调用 问题答案: 我将假设您正在使用情节提要。如果我是正确的话,那么您的问题是,在您的“第一个控制器”中创建的“”不是您要演示的实际内容。您将需要设置你的 第二控制人 不变的 第一控制人