为什么在某些情况下添加 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
的额外要求。 UIViewController
和CBCentralManager
都继承自NSObject
,所以他们满足NSObjectProtocol
的要求,但是你的Swiftclass没有superclass 没有。
不过,具有可选要求的协议不必继承自 NSObjectProtocol
。只是大部分在框架里都是这样的。例如,您可以这样做:
@objc protocol Foo {
@objc optional func foo()
}
class FooClass : Foo {
// compiles fine!
}
例如,这些是有效的并且将在没有(所有)协议存根的情况下编译
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
.
为什么我的代码在不满足所有协议要求的情况下编译?
您在这里看到的是 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
的额外要求。 UIViewController
和CBCentralManager
都继承自NSObject
,所以他们满足NSObjectProtocol
的要求,但是你的Swiftclass没有superclass 没有。
不过,具有可选要求的协议不必继承自 NSObjectProtocol
。只是大部分在框架里都是这样的。例如,您可以这样做:
@objc protocol Foo {
@objc optional func foo()
}
class FooClass : Foo {
// compiles fine!
}