首页 > 解决方案 > 一个类如何有多个同名的方法?

问题描述

我是斯威夫特的新手。制作一个适用于蓝牙低功耗 (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 背景不符合我的感知模型。无论如何,非常感谢任何帮助

标签: swiftclass-methodswift-class

解决方案


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


推荐阅读