Если в документации Apple говорится, что класс не должен быть подклассом, означает ли это, что мы должны относиться к классу как к одиночному и иметь только один?
В документации Apple есть "Примечания по подклассам", в которых иногда можно сказать, что они не относятся к конкретному классу. Например, HKHealthStore имеет в своей документации следующее слово: "Как и многие классы в HealthKit, класс HKHealthStore не должен быть разделен на подклассы".
Однако в учебнике, который компилируется, мы создали один экземпляр класса 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)
}
1 ответ
Комментарии уже достаточно хорошо решены, но чтобы собрать их вместе...
Подклассы это когда вы создаете новый класс с суперклассом:
class MyHealthStore: HKHealthStore { /* DON'T DO THIS */ }
let store = MyHealthStore()
Для класса, с которым вы работаете, Apple рекомендует избегать создания подклассов. Они не гарантируют никакого поведения в отношении того, что произойдет, если вы переопределите методы суперкласса и т. Д., Так что просто не делайте этого.
Это основанное на документации руководство эквивалентно объявлению класса как final
в Свифте. Тем не мение, HKHealthStore
и большинство других классов Apple Framework определены в ObjC, который не имеет ничего подобного final
ключевое слово, поэтому такие классы ограничиваются просто сказать "пожалуйста, не подкласс" в документации.
Синглтон - это когда класс имеет один общий экземпляр во время выполнения. Есть ряд классов инфраструктуры Apple, которые делают это, как правило, предоставляя доступ к общему экземпляру через метод класса или свойство класса: UIApplication.shared
, PHImageManager.default()
, ProcessInfo.processInfo
(ранее NSProcessInfo.processInfo()
), так далее.
В общем, нет никакого конфликта между подклассами и синглетонами. Вы можете, например, создать UIApplication
подкласс, в этом случае (при условии, что ваше приложение настроено правильно), UIApplication.shared
вернет общий экземпляр вашего подкласса.
HealthKit немного странно в этом отношении. HKHealthStore
не является одноэлементным классом - у него нет метода класса для доступа к общему экземпляру, и вы можете создать его отдельные экземпляры, используя инициализатор по умолчанию (т. е. вызов HKHealthStore()
). Однако все эти экземпляры, которые вы создаете, все еще управляют одним и тем же базовым общим ресурсом.