Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何正确使用面向对象语言Swift?_Ios_Swift_Delegates_Swift2 - Fatal编程技术网

Ios 如何正确使用面向对象语言Swift?

Ios 如何正确使用面向对象语言Swift?,ios,swift,delegates,swift2,Ios,Swift,Delegates,Swift2,我对Swift甚至是面向对象编程语言本身都是新手。所以我的问题是,如何以正确的方式使用这种非常广泛的语言?我举一个例子来验证我的问题: 假设我有两门课: 类ScanForBluetoth{}//处理要扫描BT设备的所有部分 class ScanForDevices: UIViewController, CBCentralManagerDelegate , CBPeripheralDelegate, UITableViewDelegate,UITableViewDataSource{} 类Bl

我对Swift甚至是面向对象编程语言本身都是新手。所以我的问题是,如何以正确的方式使用这种非常广泛的语言?我举一个例子来验证我的问题:

假设我有两门课:

  • 类ScanForBluetoth{}//处理要扫描BT设备的所有部分

    class ScanForDevices: UIViewController, CBCentralManagerDelegate , CBPeripheralDelegate, UITableViewDelegate,UITableViewDataSource{}
    
  • 类Bluetooth{}//仅处理带有其委托的Bluetooth部分

    class Bluetooth: ScanForDevices{}
    
  • 现在,我想在Bluetooth类中实现我所有使用过的委托和其他特定于Bluetooth的功能。但我的ScanForDevices类中也需要一些对象(例如CBCentralManagerDelegate)。因此,我必须在我的“母亲”类ScanForDevices中实现所有委托,尽管我只需要一些属性。因此,如果我实现委托,我必须遵守协议,并且必须实现所有需要的委托函数。。。最后,我在ScanForDevices中实现了我的所有委托函数,然后在Bluetooth中覆盖它们。但我不认为我的方式是实现这个问题的最好方式。。。
    谢谢你的阅读

    首先,我想指出的是,你们的命名约定真的不符合。在面向对象编程中,您希望类名是对象(名词)。您根据类所做的事情而不是它们是什么来命名它们。更好的类名称选择是BluetoothDeviceScanner,而不是设备扫描,以及BluetoothManager,而不是非显式的“bluetooth”

    其次,您所做的是将bluetooth类子类化为scan for devices类,这使它继承其类的所有功能。这真的没有任何意义。子类化用于基于父对象创建一个对象,而这两个对象处理两个完全不同的事情,然后您仍然计划重写函数。相反,您应该在bluetooth类中单独包含所需的协议。尽可能将这两个类的功能分开

    第三,应该将视图控制器功能与扫描功能分开。我的意思是“ScanForDevices”对象的任务是扫描设备,所以它不应该也有控制视图的任务。。。我将删除UIViewController协议并引入一个新的view controller类,在该类中,您可以拥有一个分配了“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的属性,此时您只需要使用BluetoothManager对象来处理视图控制器级别的所有蓝牙需求


    初始化方法
    请记住,这些初始化方法都是虚构的,与您手头的问题无关,我试图说明这就是您定义初始化结构所需参数的地方。创建结构实例时,必须传递括号中相同的参数。

    首先,我想指出,您的命名约定确实不适用。在面向对象编程中,您希望类名是对象(名词)。您根据类所做的事情而不是它们是什么来命名它们。更好的类名称选择是BluetoothDeviceScanner,而不是设备扫描,以及BluetoothManager,而不是非显式的“bluetooth”

    其次,您所做的是将bluetooth类子类化为scan for devices类,这使它继承其类的所有功能。这真的没有任何意义。子类化用于基于父对象创建一个对象,而这两个对象处理两个完全不同的事情,然后您仍然计划重写函数。相反,您应该在bluetooth类中单独包含所需的协议。尽可能将这两个类的功能分开

    第三,应该将视图控制器功能与扫描功能分开。我的意思是“ScanForDevices”对象的任务是扫描设备,所以它不应该也有控制视图的任务。。。我将删除UIViewController协议并引入一个新的view controller类,在该类中,您可以拥有一个分配了“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)
    
    }
    
    您的对象现在“连接”在您有权访问的意义上