2017-07-05 8 views
0

Ich versuche, den Delegationsprozess für Swift in Xcode 8 zu lernen.Was ist der richtige Weg, um einen Delegaten abzuleiten?

Ich kann es funktioniert gut, aber habe eine Frage über die Unterklasse in meinem Delegaten. Normalerweise wäre in Objective-C die Unterklasse dafür NSObject. Ich kann es mit NSObject und AnyObject arbeiten. Ich habe in einem Artikel gelesen, dass ich Objective-C wegen der Performance nicht überquert habe. Ist das wirklich wichtig? Wenn es keine Ansicht oder eine andere Art von Controller ist, welche Unterklasse gibt es in Swift für ein Objekt?

Ist AnyObject das gleiche wie NSObject?

Viewcontroller

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)") 
    } 
} 

Objekt 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) 
    } 
} 
+1

Es gibt keinen Grund für '' TheDelegate' AnyObject' zu verlängern (oder jede andere Klasse). – rmaddy

+0

Und nirgendwo bauen Sie ein Protokoll ab. 'ViewController' entspricht einem Protokoll, Sie haben jedoch keine Unterklassen von Delegaten (zumindest nicht in dem von Ihnen geposteten Code). – rmaddy

+0

Im Anschluss an @rmaddy scheint die Terminologie verwirrend zu sein: 'NSObject' (die Klasse) ist keine Unterklasse von irgendetwas, sondern ist * superclass * der meisten Objective-C-Objekte (und du und ignorierst die, für die sie gilt ist nicht für den Moment). – CRD

Antwort

0

Es gibt keinen Grund AnyObject Unterklasse, da alles ein AnyObject nur durch bestehende (wie object in Java) ist.

NSObject ist die alte Basisklasse in Obj-C, so dass, wenn Sie wollen Ihr Protokoll oder Klasse haben in Obj-C-Code zu sehen muss er entweder @objc gekennzeichnet sein oder es muss NSObject Unterklasse. Wenn Sie in Ihrem Programm nicht auch Obj-C verwenden, müssen Sie keine Unterklasse NSObject.

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

Verwandte Themen