大佬教程收集整理的这篇文章主要介绍了在 Swift 中,有没有办法从被扩展覆盖的 getter 访问本机属性?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用库的 iOS 应用。当 iOS 或 iPadOS 设备或模拟器在系统设置中设置为缩放模式时,此库曾经出现问题。该库的开发人员提供了一个修复程序,但他告诉我,为了从修复程序中受益,我必须使用 UIScreen nativeScale 而不是 scale。我试图通过声明这样的扩展来在不影响其余项目代码的情况下解决问题:
extension UIScreen {
open var scale: CGfloat {
get {
return nativeScale
}
}
}
这有效,但我想以某种方式使此扩展仅在设备设置为缩放模式时有效。我找到了一种检测方法,但现在我不知道如何进行。我知道我无法从其 getter 中访问 scale 属性,所以我想知道是否有可能的实现来实现这一点。感谢您的关注。
Cristik 的评论让我想到了一个解决方案。 Cristik 要求提供检测缩放模式的代码。我在 DeviceKit 存储库中找到了一个很好的实现。解决方法如下:
public var isZoomed: Bool? {
guard isCurrent else { return nil }
if Int(UIScreen.main.scale.rounded()) == 3 {
// Plus-sized
return UIScreen.main.nativeScale > 2.7 && UIScreen.main.nativeScale < 3
} else {
return UIScreen.main.nativeScale > UIScreen.main.scale
}
}
为了实现我的目标,我在 DeviceKit 中添加了这个属性:
public var originalDeviceScale: CGFloat? {
guard isCurrent else { return nil }
return UIScreen.main.scale
}
在一个完全不同的目标中,我在主项目中对 UIScreen 的扩展不适用,所以我现在可以写:
import UIKit
import DeviceKit
extension UIScreen {
open var scale: CGFloat {
get {
let device = Device()
guard let isZoomed = device.isZoomed else {
return -1
}
if isZoomed {
return nativeScale
}
guard let originalDeviceScale = device.originalDeviceScale else {
return -1
}
return originalDeviceScale
}
}
如果您不使用 DeviceKit,您可以将静态库目标添加到您的项目中,该目标仅包含 originalNativeScale 属性。 我知道这不是一个完整的解决方案,但可能对其他人有用。感谢您的关注。
以上是大佬教程为你收集整理的在 Swift 中,有没有办法从被扩展覆盖的 getter 访问本机属性?全部内容,希望文章能够帮你解决在 Swift 中,有没有办法从被扩展覆盖的 getter 访问本机属性?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。