2016-11-01 1 views
1

В документации Apple есть «Подклассные заметки», которые иногда могут сказать, что они не подклассы определенного класса. Например, HKHealthStore имеет эту формулировку in its documentation: «Как и многие классы в HealthKit, класс HKHealthStore не должен быть подклассом».Если в документации Apple не говорится о подклассе класса, значит ли это, что мы должны рассматривать класс как одноэлементный и иметь только один?

Однако в учебнике, который компилируется, мы создали один экземпляр класса HKHealthStore и использовали его для ссылки на функции HealthStore. Например:

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

Подклассы и синглтон - это две совершенно разные концепции, которые не имеют никакого отношения друг к другу. – rmaddy

+2

«Если в документации Apple говорится, что она не подкласса класса, значит ли это, что мы должны рассматривать класс как одноэлементный и иметь только один?» Нет, это не значит. Это просто означает, что вы не должны подклассифицировать его. – Rob

+1

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

ответ

1

Комментарии уже обращались это очень хорошо, но, чтобы вытащить его вместе ...


подклассов, когда вы создаете новый класс с суперкласса:

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

let store = MyHealthStore() 

Для класса, с которым вы работаете, руководство от Apple заключается в том, чтобы избежать подкласса. Они не гарантируют никакого поведения относительно того, что произойдет, если вы переопределите методы суперкласса и т. Д., Поэтому просто не делайте этого.

Данное руководство на основе документации эквивалентно объявлению класса как final в Swift. Тем не менее, HKHealthStore и большинство других классов каркаса Apple определены в ObjC, который не имеет ничего похожего на ключевое слово final, поэтому такие классы ограничиваются просто указанием «пожалуйста, не подклассы» в документации.


одноточечно когда класс имеет одного общего экземпляра во время выполнения. Есть целый ряд Apple, каркасных классов, которые делают это, как правило, обнажая доступ к совместно используемому, например с помощью метода класса или класса собственности: UIApplication.shared, PHImageManager.default(), ProcessInfo.processInfo (ранее NSProcessInfo.processInfo()) и т.д.

В общем, нет никакого конфликта между подклассов и синглетонов. Например, вы можете создать подкласс UIApplication, и в этом случае (при условии, что ваше приложение настроено правильно) UIApplication.shared вернет общий экземпляр вашего подкласса.

HealthKit немного странно в этом отношении. HKHealthStore не является одноэлементным классом - у него нет метода класса для доступа к общему экземпляру, и вы можете создавать различные экземпляры его с помощью инициализатора по умолчанию (т. Е. Вызывая HKHealthStore()). Тем не менее, все те экземпляры, которые вы создаете, все еще управляют одним и тем же базовым общим ресурсом.