swift - 一个类如何有多个同名的方法?
问题描述
我是斯威夫特的新手。制作一个适用于蓝牙低功耗 (BLE) 设备的宠物项目。感谢 Google 发现了如何运行它(扫描、连接等)。但仍然不明白它是如何工作的。代码如下:
class BLEManager: CBCentralManagerDelegate, OtherProtocols {
private var myCentral: CBCentralManager!
override init() {
super.init()
myCentral = CBCentralManager(delegate: self, queue: nil)
myCentral.delegate = self
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
// This one discover devices
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
// This one handles connection
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
// Does some stuff as well
}
}
问题是为什么这些方法具有相同的名称?我看到它们有不同的参数(命名非常清晰),但是Swift 是如何知道要调用哪个方法的呢?
Ps 可能因为 JS 背景不符合我的感知模型。无论如何,非常感谢任何帮助
解决方案
其他人称之为“重载”,但事实并非如此。重载是指函数仅通过类型来区分(Swift 支持这一点)。这不是这里发生的事情。这些函数之间的区别在于它们的名称,就像在“普通”函数中一样。Swift 在命名函数的方式上类似于 Objective-C(和 Smalltalk,但与大多数语言不同)。这些函数的名称是(遵循 ObjC 传统):
centralManager(_:didDiscover:advertisementData:rssi:)
centralManager(_:didConnect:)
centralManager(_:didDisconnectPeripheral:error:)
正如你所看到的,这是三个完全不同的名称,三个不同的函数也是如此,没有任何复杂的东西,比如重载。
在大多数语言中,参数的名称不是函数名称的一部分。但在 Smalltalk、ObjC 和 Swift 中,它们是。这不像 Python 中的“命名参数”。函数的名称包括这些参数名称,按顺序排列,并且易于区分。如果 Swift 没有从 ObjC 继承这一点,那么将这两种语言桥接起来会非常困难。
请注意,这种函数命名,其中函数名称的“基础”部分是调用者的名称(“centralManager”),来自 ObjC/Cocoa 传统。虽然由于 Cocoa(即 iOS),它在 Swift 中很常见,但在“纯 Swift”中实际上并不常见,它通常不使用这样的委托模式(例如,您在 SwiftUI 中从未见过这种模式)。所以你在这里真正看到的是 ObjC 自动音译成 Swift。
但是通过完整(包括参数)名称来区分 Swift 函数是非常常见且“Swifty”的。你最常在init
方法中看到它,但它总是发生。
推荐阅读
- java - 超时服务器端长时间运行的请求
- json - 是否有可能在 gin-gonic 绑定的 json 中消失一个范围?
- reactjs - Antd表单远程提交
- java - 未触发地图位置更改侦听器
- javascript - 使用 .includes()
- node.js - 刷新 SAML SSO 会话
- google-cloud-platform - Compute Engine 实例上的 Gitlab 不可用
- bitbucket - 有没有办法限制用户在bitbucket中创建的分支数量?
- android - 为什么我的 LayoutParams 不会改变我的布局?
- python - 在 Twisted 中执行具有时间增量的函数的最佳方法?