Log*_*gan 199 ios swift didset
Apple的文档指出:
首次初始化属性时,不会调用willSet和didSet观察者.仅在属性的值设置在初始化上下文之外时才调用它们.
是否有可能在初始化期间强制调用它们?
假设我有这门课
class SomeClass {
var someProperty: AnyObject {
didSet {
doStuff()
}
}
init(someProperty: AnyObject) {
self.someProperty = someProperty
doStuff()
}
func doStuff() {
// do stuff now that someProperty is set
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了方法doStuff,使处理调用更简洁,但我宁愿只处理didSet函数中的属性.有没有办法在初始化期间强制调用它?
我决定只为我的类删除便利的intializer并强制你在初始化后设置属性.这让我知道didSet将永远被召唤.我还没有决定这总体上是否更好,但它很适合我的情况.
Bri*_*hal 276
如果您使用defer的内部初始化,更新任何可选属性或进一步更新,你已经初始化非可选特性之后你调用的任何super.init()方法,那么你的willSet,didSet等会被调用.我发现这比实现单独的方法更方便,你必须跟踪在正确的位置调用.
例如:
public class MyNewType: NSObject {
public var myRequiredField:Int
public var myOptionalField:Float? {
willSet {
if let newValue = newValue {
print("I'm going to change to \(newValue)")
}
}
didSet {
if let myOptionalField = self.myOptionalField {
print("Now I'm \(myOptionalField)")
}
}
}
override public init() {
self.myRequiredField = 1
super.init()
// Non-defered
self.myOptionalField = 6.28
// Defered
defer {
self.myOptionalField = 3.14
}
}
}
Run Code Online (Sandbox Code Playgroud)
将产量:
I'm going to change to 3.14
Now I'm 3.14
Run Code Online (Sandbox Code Playgroud)
Oli*_*ver 96
创建一个自己的set-Method并在init-Method中使用它:
class SomeClass {
var someProperty: AnyObject! {
didSet {
//do some Stuff
}
}
init(someProperty: AnyObject) {
setSomeProperty(someProperty)
}
func setSomeProperty(newValue:AnyObject) {
self.someProperty = newValue
}
}
Run Code Online (Sandbox Code Playgroud)
Cha*_*ism 74
作为Oliver答案的变体,你可以将这些行包裹在一个闭包中.例如:
class Classy {
var foo: Int! { didSet { doStuff() } }
init( foo: Int ) {
// closure invokes didSet
({ self.foo = foo })()
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:Brian Westphal的回答是更好的imho.关于他的好处是它暗示了意图.
小智 10
我有同样的问题,这对我有用
class SomeClass {
var someProperty: AnyObject {
didSet {
doStuff()
}
}
init(someProperty: AnyObject) {
defer { self.someProperty = someProperty }
}
func doStuff() {
// do stuff now that someProperty is set
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40079 次 |
| 最近记录: |