如果 Apple 的文档说不要 subclass a class,这是否意味着我们应该将 class 视为单例并且只有一个?
If Apple's documentation says not to subclass a class, does this mean we should treat the class as a singleton and have only one?
在 Apple 的文档中有 "Subclassing Notes" 有时可能会说不要 class 特定的 class。例如 HKHealthStore 有这样的措辞 in its documentation:"Like many classes in HealthKit, the HKHealthStore class should not be subclassed.".
但是,在编译教程中,我们创建了一个 HKHealthStore 实例 class 并将其用于引用 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)
}
评论已经很好地解决了这个问题,但是把它放在一起...
Subclassing 是当您使用 superclass:
创建新的 class 时
class MyHealthStore: HKHealthStore { /* DON'T DO THIS */ }
let store = MyHealthStore()
对于您正在使用的 class,Apple 的指导是避免 subclassing。如果您重写 superclass 的方法等,他们不保证任何关于发生的事情的行为......所以不要这样做。
此基于文档的指南等同于在 Swift 中将 class 声明为 final
。然而,HKHealthStore
和大多数其他 Apple 框架 classes 是在 ObjC 中定义的,它没有任何类似 final
关键字的东西,所以这样的 classes 仅限于在文档中说 "please don't subclass"。
A 单例 是 class 在 运行 时有一个共享实例。有许多 Apple 框架 classes 可以执行此操作,通常通过 class 方法或 class 属性: UIApplication.shared
公开对共享实例的访问, PHImageManager.default()
、ProcessInfo.processInfo
(原 NSProcessInfo.processInfo()
)等
一般来说,subclassing 和单例之间没有冲突。例如,欢迎您创建一个 UIApplication
subclass,在这种情况下(假设您的应用设置正确),UIApplication.shared
将 return 共享实例你的子class.
HealthKit 在这方面有点奇怪。 HKHealthStore
不是单例 class — 它没有用于访问共享实例的 class 方法,您可以使用默认初始化程序创建它的不同实例(即调用 HKHealthStore()
).但是,您创建的所有这些实例仍然管理相同的底层共享资源。
在 Apple 的文档中有 "Subclassing Notes" 有时可能会说不要 class 特定的 class。例如 HKHealthStore 有这样的措辞 in its documentation:"Like many classes in HealthKit, the HKHealthStore class should not be subclassed.".
但是,在编译教程中,我们创建了一个 HKHealthStore 实例 class 并将其用于引用 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)
}
评论已经很好地解决了这个问题,但是把它放在一起...
Subclassing 是当您使用 superclass:
创建新的 class 时class MyHealthStore: HKHealthStore { /* DON'T DO THIS */ }
let store = MyHealthStore()
对于您正在使用的 class,Apple 的指导是避免 subclassing。如果您重写 superclass 的方法等,他们不保证任何关于发生的事情的行为......所以不要这样做。
此基于文档的指南等同于在 Swift 中将 class 声明为 final
。然而,HKHealthStore
和大多数其他 Apple 框架 classes 是在 ObjC 中定义的,它没有任何类似 final
关键字的东西,所以这样的 classes 仅限于在文档中说 "please don't subclass"。
A 单例 是 class 在 运行 时有一个共享实例。有许多 Apple 框架 classes 可以执行此操作,通常通过 class 方法或 class 属性: UIApplication.shared
公开对共享实例的访问, PHImageManager.default()
、ProcessInfo.processInfo
(原 NSProcessInfo.processInfo()
)等
一般来说,subclassing 和单例之间没有冲突。例如,欢迎您创建一个 UIApplication
subclass,在这种情况下(假设您的应用设置正确),UIApplication.shared
将 return 共享实例你的子class.
HealthKit 在这方面有点奇怪。 HKHealthStore
不是单例 class — 它没有用于访问共享实例的 class 方法,您可以使用默认初始化程序创建它的不同实例(即调用 HKHealthStore()
).但是,您创建的所有这些实例仍然管理相同的底层共享资源。