- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这远远超出了我的编程理解范围,因此非常感谢任何帮助理解这个概念的人。
我有一个层类,FloaterContainerLayer。
class FloaterContainerLayer:CALayer {
var gravity:CGFloat = 5.0
var maxFloaters = 9
var image:String?
var velocity:CGFloat = 50.0
}
我一直都有这个类的三个实例。其中之一是 dotLayer。
lazy var dotLayer : FloaterContainerLayer = {
let scrollLayer = FloaterContainerLayer()
scrollLayer.bounds = self.view.layer.bounds
scrollLayer.position = CGPoint(x: self.view.bounds.size.width/2, y: self.view.bounds.size.height/2)
scrollLayer.image = "dot"
scrollLayer.gravity = dotLayerGravity
return scrollLayer
}()
在其他地方,我有一个点层的重力变量。
var dotLayerGravity: CGFloat {
get {
if let stored = userDefaults.objectForKey("dotLayerGravity") {
return CGFloat(stored as! NSNumber)
}
else {
return 10.0
}
}
set(value) {
userDefaults.setValue(value, forKey: "dotLayerGravity")
}
}
现在,这个值可以随时更改。我在每秒调用 60 次的 View 渲染方法中使用 dotLayer.gravity
。
我想完成的是:
当我设置dotLayer.gravity = dotLayerGravity
然后打电话dotLayer.gravity
,
我希望它返回 dotLayerGravity
。
仅将类中的重力变量设置为 dotLayerGravity
不是一个选项,因为该类用于三个实例。
最佳答案
使用 CGFloat/Float/Double/Int ,... 作为指针在 Swift 中是不可能的,因为它们是值类型。一种可能的解决方案是创建一个简单的包装类来充当指针。
class CGFloatPointer : FloatLiteralConvertible {
var value : CGFloat = 0
required convenience init(floatLiteral value: Float) {
self.init()
self.value = CGFloat(value)
}
}
您可以使用诸如 FloatLiteralConvertible
之类的东西来扩展此类,以使其更易于使用。
var gravity:CGFloatPointer = 5.0
这比 UnsafePointer
更容易维护。
一个微小的细节。从您的解释听起来您将大量加载/保存 UserDefaults。这很糟糕,因为它很慢。
对于您的代码,我会推荐一些介于全局变量和单例之间的东西,并加入一些额外的魔力来调节读/写操作。
class DotLayerGravity {
private static var inMemory : CGFloat?
static var value: CGFloat {
get {
if let inMemory = inMemory {
return inMemory
} else {
let fetchedGravity = (NSUserDefaults.standardUserDefaults().objectForKey("dotLayerGravity") as? NSNumber) ?? 10
inMemory = CGFloat(fetchedGravity)
return inMemory!
}
}
set(value) {
NSUserDefaults.standardUserDefaults().setValue(value, forKey: "dotLayerGravity")
// setting this to nil will make it fetch from permanenent storage.
inMemory = nil
}
}
}
因为 value
是一个 static
属性,它可以在您的应用程序的任何地方访问。这根本不需要,但它确实保证只有一个该值的实例。
inMemory
是 private
并且将保存 NSUserDefaults
的值,直到写操作完成。 private
为类提供更清晰的界面。
当你得到 value
的值时,它会首先通过展开 inMemory
来检查它是否在内存中有一个值,如果是 nil
,它将回退到 NSUserDefaults
,当它也是 nil
时,它将回退到默认值。
它将获取的或默认的值存储在inMemory
中并返回最终结果。这确保从 NSUserDefaults
中读取最少的内容。
这不是线程安全的,但可以做到。
重读你的问题,让我明白每个实例都有自己的 gravity
存储在 NSUserDefaults
中。在那种情况下,我会让 FloaterContainerLayer
完全负责 gravity
通过设置和 identifier
String
将用于加载/保存到 NSUserDefaults
。
class FloaterContainerLayer:CALayer {
var maxFloaters = 9
var image:String?
var velocity:CGFloat = 50.0
var identifier : String = "floaterContainerIdentifier"
private var inMemoryGravity : CGFloat?
var gravity: CGFloat {
get {
if let inMemory = inMemoryGravity {
return inMemory
} else {
let fetchedGravity = (NSUserDefaults.standardUserDefaults().objectForKey(identifier) as? NSNumber) ?? 10
inMemoryGravity = CGFloat(fetchedGravity)
return inMemoryGravity!
}
}
set(value) {
NSUserDefaults.standardUserDefaults().setValue(value, forKey: identifier)
// setting this to nil will make it fetch from permanenent storage.
inMemoryGravity = nil
}
}
}
class SomeViewController : UIViewController {
lazy var dotLayer : FloaterContainerLayer = {
let scrollLayer = FloaterContainerLayer()
scrollLayer.bounds = self.view.layer.bounds
scrollLayer.position = CGPoint(x: self.view.bounds.size.width/2, y: self.view.bounds.size.height/2)
scrollLayer.image = "dot"
scrollLayer.identifier = "dotLayerGravity"
return scrollLayer
}()
}
关于ios - 使对象变量成为指向另一个变量的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36386897/
我正在学习 Go,但我无法在任何地方找到这个答案。 Web开发中的文件扩展名是否有任何官方标准?我见过多种约定,例如 .tmpl 和 .gtpl,这是什么?谢谢。 最佳答案 没有固定的标准,但有一些相
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8 年前关闭。 Improve
假设我有两个类(class) Widget ^ | Window 我还有另一个类应用程序: 定义如下 class Application { public: ... private:
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我多年来一直在使用 MySQL,直到去年左右,主要是在较小的项目上。我不确定是语言的性质还是我缺乏真正的教程让我不确定我正在写的东西是否是优化目的和扩展目的的正确方法。 虽然自学 PHP,但我对自己和
我已经多次读到 EJB 是重量级的……但昨晚我正在浏览关于 EJB 的 Java EE 6 教程,它们似乎只是普通的 Java 对象,除了它们可以有像 Stateless 或 Singletons 这
如何使此 SimpleModal 脚本在页面加载时加载而不是单击按钮?谢谢=) Demo 基本模态对话框 对于此演示,SimpleModal 使用此“隐藏”数据作为其内容。您还可以使用标准 HTML
这是 Haskell 中的代码: class Fooable a where foo :: a -> a instance Fooable (a, a) where foo = ...
是否有推荐的方法来测试 Actor 是否使用 be 正确改变了其行为?我更喜欢使用 FSM 的原因之一是因为我可以轻松验证 Actor 是否已更改其行为。我不知道在使用 become/unbecome
我正在构建一个位于“php my admin”中的表,我是在第一次点击其中一个“th”它的 asc 时这样做的,现在我试图在第二次点击时制作 desc ..有什么想法吗? 阿姆..很多我不记得了抱歉.
考虑以下网页。 我在 Firefox 中打开此页面,打开 JS 控制台并键入以下内容。 > document.getElementById(
如何让自己成为 postgresql 的 super 用户? 我一直在尝试创建数据库,但我不断收到以下错误: createdb: database creation failed: ERROR: pe
Query没有太大帮助。 如前所述here , PostgreSQL 是 ORDBMS。 here ,它解释了 PostgreSQL 是 RDBMS。 PostgreSQL 是一个 ORDBMS 是什
我已经看到,当在导航元素中使用的链接中垂直/水平居中文本时,将链接设置为 flex 容器会很有用。我没有意识到链接文本实际上可以是一个(单个) flex 元素。我可以看到链接中的 span 元素可以是
我见过很多说明如何找到给定集合的子集的示例,但是您如何将一个集合设为另一个集合的子集?所以集合 B 是集合 A 的子集,这将如何实现?我目前正在使用递归性质的方案,但是这本书只展示了如何列出子集而不是
有些程序会根据其标准输出是否为 tty 来更改其输出。因此,如果您将它们放入管道或重定向它们,输出将与您的 shell 中的不同。这是一个例子: $ touch a b c # when runnin
我正处于项目的开始阶段,到目前为止我一直在使用默认的 MySQL 数据库。 对了,默认的数据库有名字吗? 我的问题是如何在不删除当前表和创建新表的情况下将现有表更改为 utf-8 和 InnoDB。是
我正在尝试编写一个过滤器来包装数据以遵循 JSON API spec到目前为止,它适用于我直接返回 ActionResult 的所有情况,例如 ComplexTypeJSON。我试图让它在像 Comp
我在 Storyboard 上创建了一个带有一个 UITextField 的自定义 UIViewController。在 viewDidLoad 上,我将 UITextFIeld 设置为 become
我已经看到关于 valueless_by_exception 方法的 cppreference 的以下注释: A variant may become valueless in the followi
我是一名优秀的程序员,十分优秀!