为什么在某些情况下添加 Swift 协议不需要所有通常需要的方法?

Why does adding a Swift protocol in some situations not require all the normally required methods?

例如,这些是有效的并且将在没有(所有)协议存根的情况下编译

public class ViewController: UIViewController, SFSpeechRecognizerDelegate {

}


class BLEController: CBCentralManager, CBCentralManagerDelegate {
    func centralManagerDidUpdateState(_ central: CBCentralManager) {

    }
}

编辑:已解决!在不继承 UIViewController 或 CBCentralManager 的情况下创建 class 仍然符合委托协议,但它不符合 NSObjectProtocol。似乎我正试图以一种意想不到的方式使用这些框架。

它无需协议存根即可编译,因为所有要求都是可选的。在 SFSpeechRecognizerDelegate 的声明中检查它只有一个名为 availabilityDidChange 的方法的要求,您可以从函数开头给出的关键字中看到它是 optional

在第二种情况下,您创建的 class 不会继承自 NSObject 但第一个会继承,因为它是 UIViewController 的子 class这又是 NSObject.

的子 class

为什么我的代码在不满足所有协议要求的情况下编译?

您在这里看到的是 optional protocol requirements。它们在这里是因为 Swift 代码需要与 Objective-C 交互,而 Objective-C 有它们。

CBCentralManagerDelegate中声明的除centralManagerDidUpdateState之外的所有方法都是可选的,from here:

The only required method is centralManagerDidUpdateState(_:); the central manager calls this when its state updates, thereby indicating the availability of the central manager.

SFSpeechRecognizerDelegate,只包含一个可选方法,from here

Use this protocol's optional method to track those changes and provide an appropriate response.


如果删除 superclasses,为什么代码无法编译?

这是因为你问题中的这两个协议也继承自NSObjectProtocol,所以它们实际上也有NSObjectProtocol的额外要求。 UIViewControllerCBCentralManager都继承自NSObject,所以他们满足NSObjectProtocol的要求,但是你的Swiftclass没有superclass 没有。

不过,具有可选要求的协议不必继承自 NSObjectProtocol。只是大部分在框架里都是这样的。例如,您可以这样做:

@objc protocol Foo {
    @objc optional func foo()
}

class FooClass : Foo {
    // compiles fine!
}