gpt4 book ai didi

ios - 如果 Apple 的文档说不要子类化一个类,这是否意味着我们应该将该类视为单例并且只有一个?

转载 作者:行者123 更新时间:2023-11-29 11:52:55 26 4
gpt4 key购买 nike

在 Apple 的文档中有“子类化注释”,有时可能会说不要对特定类进行子类化。例如 HKHealthStore 有这个措辞 in its documentation : "与 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)
}

最佳答案

评论已经很好地解决了这个问题,但是把它放在一起......


子类化 是指您使用父类(super class)创建新类:

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

let store = MyHealthStore()

对于您正在使用的类,Apple 的指导是避免子类化。如果您重写父类(super class)的方法等,他们不保证任何关于发生的事情的行为......所以不要这样做。

这种基于文档的指导相当于在 Swift 中将类声明为 final。然而,HKHealthStore 和大多数其他 Apple 框架类都是在 ObjC 中定义的,它没有任何类似 final 关键字的东西,所以这些类仅限于说“请不要文档中的“子类”。


单例 是指类在运行时只有一个共享实例。有许多 Apple 框架类可以执行此操作,通常通过类方法或类属性公开对共享实例的访问:UIApplication.sharedPHImageManager.default() , ProcessInfo.processInfo(原 NSProcessInfo.processInfo())等

一般来说,子类化和单例之间没有冲突。例如,欢迎您创建一个 UIApplication 子类,在这种情况下(假设您的应用设置正确),UIApplication.shared 将返回共享实例你的子类。

HealthKit 在这方面有点奇怪。 HKHealthStore 不是单例类——它没有用于访问共享实例的类方法,您可以使用默认初始化程序(即调用 HKHealthStore())。但是,您创建的所有这些实例仍然管理相同的底层共享资源。

关于ios - 如果 Apple 的文档说不要子类化一个类,这是否意味着我们应该将该类视为单例并且只有一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40366073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com