swift - 协议(protocol)的 `: AnyObject` 和 `none` 有什么区别?

标签 swift

1.

protocol A: AnyObject { }

2.

protocol A { }

我知道case 1可以限制class-type

但是,我为什么要限制类类型?

最佳答案

AnyObject 要求符合类型是类,而不是结构或枚举。参见 Class-Only Protocols了解详情。

类提供引用语义,而不是您的协议(protocol)可能需要的值语义。例如,如果你想观察一个对象,那只对引用类型有意义(你不能观察值类型的变化,因为值类型在修改时被复制)。有关更多详细信息,请参阅 Structures and Classes ,尤其是解释值和引用类型的部分。

没有与 AnyObject 等效的值类型。您不能要求协议(protocol)具有值语义。这可能会导致一些头痛。作为差异的示例,请考虑以下内容:

protocol Incrementing {
    var value: Int { get set }
}

extension Incrementing {
    func incremented() -> Self {
        var new = self  // Value types copy, reference types reference
        new.value += 1
        return new
    }
}

struct S: Incrementing { var value: Int = 0 }

class C: Incrementing { var value: Int = 0 }

var s = S()
s.incremented().value  // 1
s.value                // 0

var c = C()
c.incremented().value  // 1
c.value                // 1 (!!!)

这段代码对结构有意义,但对类来说是错误的。目前在 Swift 中还没有真正解决这个问题。

关于swift - 协议(protocol)的 `: AnyObject` 和 `none` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58100535/

相关文章:

ios - 将 UIView 放在 UITableView 的上方

ios - UICollectionView 阴影未正确显示

ios - 使用 Parse 保存 FB Img

ios - UILabel 高度取决于文本

ios - Swift Json 数据解析(无需数组)

swift - 我的图像 addSubview 添加了比预期更大的 View

导航 Controller 转换上的 iOS 黑线

swift - 如何通过循环组合 TextView ?

ios - Whatsapp、Messenger、Facebook、Skype 在 ios 中使用 webrtc 进行音频视频流(用于视频 session )

ios - 如何在按钮函数中传递特定函数的常量值以将其用作导航目的地