It appears that this email never showed up on the list. I'm sending it again, 
with the risk of it appearing twice later. 

> 30 maj 2016 kl. 22:56 skrev Gmail <david.ronnqv...@gmail.com>:
> 
> Several weeks ago I posted that I was confused by the differences between how 
> static variables and lazy variables evaluated (or - as I would expect - 
> didn’t evaluate) when initially assigned with a different value. It didn’t 
> result in any discussion, but I encountered it again and decided to draft a 
> proposal hoping that there will be some discussion around it. The draft is 
> available here: 
> https://github.com/d-ronnqvist/swift-evolution/blob/master/proposals/0000-static-var-lazy-behavior.md
> 
> Please let me know what you think, and if you believe this is something 
> that’s worth pursuing.
> 
> - David
> 
> 
> Lazy evaluation when assigning static variables
> Proposal: SE-NNNN
> Author(s): David Rönnqvist
> Status: Awaiting review
> Review manager: TBD
> Introduction
> Both stored type properties (static) and lazy stored properties (lazy var) 
> are lazily initialized. However, they have different initialization behavior 
> in that stored type properties evaluate even when assigning them a new value.
> 
> The following code will print "static", but not "lazy":
> 
> class Foo {
>     static var bar: String = {
>         print("static")
>         return "Default"
>     }()
> 
>     lazy var baz: String = {
>         print("lazy")
>         return "Lazy"
>     }()
> }
> 
> Foo.bar = "Set" // this evaluates the initial value of `bar` before setting a 
> new value
> 
> let foo = Foo()
> foo.baz = "Set" // this doesn't evaluate `baz` before setting a new value
> Swift-evolution thread: [Discussion] Difference between static and lazy 
> variables regarding evaluation of closure
> 
> Motivation
> Swift currently evaluates stored type properties even when assigning a new 
> value. This behavior is very subtle and can lead to objects being needlessly 
> initialized and "immediately" de-initialized, as well as unwanted side 
> effects (caused by the initialized objects).
> 
> For example, a shared re-assignable instance that is replaced during unit 
> test set up will initialize the "real" object before assigning the test 
> replacement. 
> 
> Detailed design
> This proposal seeks to unify the lazy evaluation on assignment of stored type 
> properties (static) and lazy stored properties (lazy var) so that the value 
> being replaced isn't evaluated (the current behavior of lazy stored 
> properties). 
> 
> However, it seeks to keep their respective behaviors and guarantees regarding 
> multithreaded simultaneous access:
> 
> From the The Swift Programming Language (Swift 2.2) regarding lazy stored 
> properties: 
> 
> If a property marked with the lazy modifier is accessed by multiple threads 
> simultaneously and the property has not yet been initialized, there is no 
> guarantee that the property will be initialized only once.
> and regarding stored type properties:
> 
> Stored type properties are lazily initialized on their first access. They are 
> guaranteed to be initialized only once, even when accessed by multiple 
> threads simultaneously, and they do not need to be marked with the lazy 
> modifier.
> No changes to the syntax is proposed. 
> 
> This provides a more consistent lazy evaluation behavior, and fixes a (small) 
> source of potential, subtle bugs.
> 
> Impact on existing code
> This proposal changes the lazy evaluation of stored type properties when 
> assigning a new value. 
> 
> Any code that is relying on this effect would break in subtle ways. This is 
> hard to detect and migrate, but hopefully very rare (and to the best of my 
> knowledge the behavior that code would be relying upon is undocumented).
> 
> Alternatives considered
> One alternative is to be consistent with the stored type properties and 
> always evaluate the initial value, even when re-assigning it. However, this 
> version doesn't address the subtle bugs that can arise from this behavior.
> 
> Another alternative is to leave the the respective behaviors as is and 
> mention their differences in The Swift Programming Language guide. This might 
> still be the most viable alternative in case the current behavior is a 
> consequence of their respective implementations with regards to multithreaded 
> access.
> 
> Rationale
> On [Date], the core team decided to (TBD) this proposal. When the core team 
> makes a decision regarding this proposal, their rationale for the decision 
> will be written here.
> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to