2016-11-01 4 views
1

In Apples Dokumentation gibt es "Subclassing Notes", die manchmal sagen können, dass eine bestimmte Klasse nicht unterklassifiziert wird. Zum Beispiel hat HKHealthStore dieses Wort in its documentation: "Wie viele Klassen in HealthKit sollte die HKHealthStore-Klasse nicht unterklassifiziert werden.".Wenn die Dokumentation von Apple besagt, dass eine Klasse nicht unterklassifiziert werden soll, bedeutet das, dass wir die Klasse als Singleton behandeln und nur eine Klasse haben sollen?

In einem Tutorial, das kompiliert wird, haben wir jedoch eine Instanz der HKHealthStore-Klasse erstellt und diese als Referenz für die HealthStore-Funktionen verwendet. Zum Beispiel:

let currentHealthStore = HKHealthStore() 

if HKHealthStore.isHealthDataAvailable(){ 
      //The following is for if HealthKit is supported in this device 
      print("Yes, this iPhone 6 Plus supports Health Information") 

      let typesToRead = dataToRead() 
      let typesToWrite = dataToWrite() 
      currentHealthStore.requestAuthorization(toShare: typesToWrite as? Set<HKSampleType>, read: typesToRead as? Set<HKObjectType>, completion: { (success, error) -> Void in 

       if success{ 

        // We will update UI to preview data we read. 
        DispatchQueue.main.async(execute: {() -> Void in 

         self.loadView() 
        }) 

       } 
       else{ 

        print("User didn't allow HealthKit to access these read/write data types") 
       } 

      }) 
     } else { 
      let alertController = UIAlertController(title: "Warning", message: "HealthKit is not available in your device!", preferredStyle: UIAlertControllerStyle.alert) 

      alertController.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.cancel, handler: nil)) 

      self.present(alertController, animated: true, completion: nil) 
     } 
+4

Unterklassen und Singleton sind zwei völlig unterschiedliche Konzepte, die nichts miteinander zu tun haben. – rmaddy

+2

"Wenn die Dokumentation von Apple besagt, dass eine Klasse nicht unterklassifiziert werden soll, bedeutet das, dass wir die Klasse als Singleton behandeln und nur einen haben sollen?" ... Nein, das heißt nicht. Es bedeutet nur, dass Sie es nicht unterklassifizieren sollten. – Rob

+1

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html – Zolnoor

Antwort

1

Kommentare haben dies bereits ziemlich gut angesprochen, aber es zusammen zu ziehen ...


Subclassing ist, wenn Sie eine neue Klasse mit einer übergeordneten Klasse zu erstellen:

class MyHealthStore: HKHealthStore { /* DON'T DO THIS */ } 

let store = MyHealthStore() 

Für die Klasse, mit der Sie arbeiten, besteht die Anleitung von Apple darin, Unterklassen zu vermeiden. Sie garantieren kein Verhalten in Bezug darauf, was passiert, wenn Sie Methoden der Superklasse usw. außer Kraft setzen ... also tun Sie es einfach nicht.

Diese auf Dokumentation basierende Anleitung entspricht der Deklaration einer Klasse als final in Swift. HKHealthStore und die meisten anderen Apple-Framework-Klassen sind jedoch in ObjC definiert, das nichts mit einem Schlüsselwort final zu tun hat. Daher sind solche Klassen darauf beschränkt, in der Dokumentation nur "bitte nicht Unterklasse" zu sagen.


A Singletons ist, wenn eine Klasse eine einzelne gemeinsam genutzte Instanz zur Laufzeit hat. Es gibt eine Reihe von Apple-Framework-Klassen, die dies tun, in der Regel den Zugriff auf den gemeinsam genutzten Instanz über eine Klassenmethode auszusetzen oder Klasseneigenschaft: UIApplication.shared, PHImageManager.default(), ProcessInfo.processInfo (früher NSProcessInfo.processInfo()) usw.

Im Allgemeinen gibt es keinen Konflikt zwischen Unterklassen und Singletons. Sie können beispielsweise eine Unterklasse UIApplication erstellen. In diesem Fall (vorausgesetzt, Ihre App ist ordnungsgemäß eingerichtet) gibt UIApplication.shared die gemeinsam genutzte Instanz Ihrer Unterklasse zurück.

HealthKit ist in dieser Hinsicht ein bisschen seltsam. HKHealthStore ist keine Singleton-Klasse - sie verfügt nicht über eine Klassenmethode für den Zugriff auf eine gemeinsam genutzte Instanz und Sie können eigene Instanzen mit dem Standardinitialisierer erstellen (d. H. Aufruf HKHealthStore()). Alle von Ihnen erstellten Instanzen verwalten jedoch immer noch dieselbe zugrunde liegende freigegebene Ressource.

Verwandte Themen