我是Swift中的新手,甚至是面向对象编程语言本身。所以我的问题是,如何以正确的方式使用这种非常广泛的语言Swift?我举一个例子来验证我的问题:
我们说我有两节课:
Class ScanForBluetoth {} //处理所有部件以扫描BT设备
class ScanForDevices: UIViewController, CBCentralManagerDelegate , CBPeripheralDelegate, UITableViewDelegate,UITableViewDataSource{}
Class Bluetooth {} //只处理蓝牙部分及其代表
class Bluetooth: ScanForDevices{}
现在,我想将所有使用过的代理和其他蓝牙特定功能实现到蓝牙类中。但我在ScanForDevices类中也需要一些对象(例如CBCentralManagerDelegate)。所以,我必须在我的"母亲"中实施我的所有代表。 class ScanForDevices虽然我只需要一些属性。因此,如果我实现委托,我必须遵守协议,并且必须实现所有我需要的委托函数...最后,我已经在ScanForDevices中实现了我的所有委托函数,然后在蓝牙中覆盖它们。但我不认为我的方式是实现这个问题的最佳方式...... 谢谢你的阅读!
答案 0 :(得分:3)
首先,我想指出你的命名约定真的没有了。在面向对象编程中,您希望类名是对象(名词)。你根据他们正在做的事情命名你的课程,而不是他们的课程。对于类来说,更好的名称选择可能是BluetoothDeviceScanner,而不是扫描设备,而不是蓝牙管理器,而不是非显式的“蓝牙”。
其次,您所做的是子类蓝牙类来扫描设备类,这会导致它继承其类的所有功能。这真的没有任何意义。子类化用于基于父对象创建对象,而这两个对象处理两个完全不同的事物,然后您计划覆盖函数。而不是那样,你应该分别在蓝牙类中包含你需要的协议。保持两个类的功能尽可能分开。
第三,您应该将视图控制器功能与扫描功能分开。我的意思是“ScanForDevices”对象的工作是扫描设备,所以它不应该还有控制视图的工作......我会删除UIViewController协议并引入一个新的视图控制器类,并在该类中您可以拥有一个分配了“ScanForDevices”对象的属性,此时可以在viewcontroller中扫描设备,但扫描功能包含在一个对象中(这是最佳实践)。
您需要做的就是“连接”数据,让您的BluetoothManager和BluetoothScanner对象将它们作为您需要的任何视图控制器中的属性提供。因此,在viewcontroller中声明了一些属性,我通常使用optionals来做这些,这样我就不必担心初始化属性了(这意味着你需要在使用之前解包变量)。 在ViewController中......
var bluetoothScanner: BluetoothScanner?
var bluetoothManager: BluetoothManager?
override func viewDidLoad() {
super.viewDidLoad()
bluetoothScanner = BluetoothScanner(init parameters)
bluetoothManager = BluetoothManager(init parameters)
}
您的对象现在已经“连接”,因为您可以在viewcontroller中访问它们及其所有属性/方法。现在我考虑一下,你甚至不需要在这个级别上同时拥有这两个对象。您可以将BluetoothScanner存储为蓝牙管理器的属性,此时您只需要使用BluetoothManager对象来处理视图控制器级别的所有蓝牙需求。
//init method that takes 2 parameters, a string and a uiviewcontroller.
init(param1: String, param2: UIViewController) {
//Struct init code using parameters
self.name = param1
self.viewController = param2
}
//init method that takes no parameters, but still initializes the same properties.
init() {
self.name = "YungGun"
self.viewController = UIViewController()
}
请记住,这些初始化方法已经完成,与您手头的问题无关,我试图说明这是定义初始化结构所需参数的地方。在创建结构的实例时,必须传递括号中的相同参数。