Если в документации 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()). Однако все эти экземпляры, которые вы создаете, все еще управляют одним и тем же базовым общим ресурсом.

Другие вопросы по тегам