class 如何有多个同名方法?

How a class has several methods with the same name?

我是 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知道调用哪个方法吗?

P.s。也许因为 JS 背景,它不适合我的感知模型。无论如何,非常感谢任何帮助

Swift 与 javascript 有点不同,因为它是编译型和类型化的。

这种模式称为方法重载(函数重载),是许多编程语言中的常见模式。

虽然在 js 中您可以在不向函数发送适当参数的情况下调用函数,但这在 swift 中是不可能的。因此 swift 根据调用时使用的参数知道要使用哪种方法。

其他人称之为“超载”,但事实并非如此。重载是指函数仅通过它们的类型来区分(并且 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 方法中看到它,但它无处不在。