【问题标题】:What's the proper way to subclass a delegate?子类化委托的正确方法是什么?
【发布时间】:2017-12-09 15:34:38
【问题描述】:

我正在尝试学习 Xcode 8 中 Swift 的委托过程。

我可以让它正常工作,但是对我的委托中的子类有疑问。通常,在 Objective-C 中,它的子类是NSObject。我可以让它与NSObjectAnyObject 一起工作。我读了一篇关于因为性能而没有跨越 Objective-C 的文章。这真的重要吗?如果它不是视图或任何其他类型的控制器,那么 Swift 中对象的子类是什么?

AnyObjectNSObject 一样吗?

视图控制器

import UIKit

class ViewController: UIViewController, TestDelegate {
    // init the delegate
    let theDelegate = TheDelegate ()

    @IBOutlet weak var label1: UILabel!

    @IBAction func button1(_ sender: Any) {
        // tell the delegate what to do
        theDelegate.run(add: 1)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        theDelegate.delegate = self
    }

    // the protocol
    func didTest(int: Int) {
        label1.text = "\(int)"
        print ("Got back from delegate \(int)")
    }
}

对象 TestProtocol.swift

import Foundation

protocol TestDelegate: class {
    func didTest(int: Int)
}

class TheDelegate: AnyObject{
    weak var delegate: TestDelegate?
    func run(add: Int){
        let test = add + 1
        delegate?.didTest(int: test)
    }
}

【问题讨论】:

  • TheDelegate 没有理由扩展 AnyObject(或任何其他类)。
  • 而且你没有在任何地方子类化协议。 ViewController 符合协议,但您没有任何委托的任何子类(至少在您发布的代码中没有)。
  • 从@rmaddy 开始,您似乎混淆了术语:NSObject(类)不是任何东西的子类,而是大多数 Objective- 的 superclass C 对象(而你并忽略那些暂时不适用的对象)。
  • 还有NSObject协议NSObject类都符合。 Swift 的AnyObject 也是一个协议,它和NSObject 协议,而不是类,具有相似的含义/目的。

标签: swift delegates


【解决方案1】:

没有理由对AnyObject 进行子类化,因为一切都是AnyObject,只是存在(就像Java 中的object)。

NSObject 是 Obj-C 中的旧基类,所以如果你想在 Obj-C 代码中看到你的协议或类,它必须标记为 @objc 或者它必须是 NSObject 的子类。

因此,除非您还在程序中使用 Obj-C,否则您不需要子类化 NSObject

看看 Swift 3: subclassing NSObject or not? https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多