[swift-evolution] [Proposal] Property behaviors

Wallacy wallacyf at gmail.com
Tue Jan 19 06:43:05 CST 2016


And how about:

instead that:

var behavior Foo: Int {
  // behavior body
}

that:

struct Foo<Int>: behavior{
  // behavior body
}



Or something like that....

Em ter, 19 de jan de 2016 às 02:03, Joe Groff via swift-evolution <
swift-evolution at swift.org> escreveu:

>
> On Jan 18, 2016, at 7:57 PM, davesweeris at mac.com wrote:
>
> Can we use “#” or something other than “.”, both to make it clear we’re
> referencing a behavior rather than a property, and so that we can avoid
> naming collisions when x has a property “lazy” *and* is declared with the
> lazy behavior?
> x.lazy.clear() // a property named “lazy” which has a clear() method
> x#lazy.clear() // the behavior named “lazy”
> I kinda like “#” (or whatever) for declaring them, too:
> var x #(lazy) = 6
>
>
>
> I’m a definite +1 on the concepts behind your proposal, but there are
> really two distinct things going on here: behaviors that mess with the
> type, and those that don’t. I mean, if you define your Lazy “behavior” like
> this:
> struct Lazy<T> {
>     private let closure: () -> T
>     private var storage: T? = nil
>     var value: T {
> mutating get {
>     if storage == nil { storage = closure() }
>             return storage!
> }
> mutating set {
>     storage = newValue
> }
>     }
>     init(_ closure: () -> T) {
>         self.closure = closure
>     }
> }
>
> then the only difference between
> lazy var foo = {
>     return 4
> }
> and
> var foo = Lazy {
>     return 4
> }
> is that in the former case, the property is implicitly accessed:
> var bar = foo
> foo = 10
> and in the latter, we have to access it explicitly:
> var bar = foo.value
> foo.value = 10
>
> If we expose the mechanism currently used by `T!` to convert between
> itself and T, and allow structs, enums, classes, and maybe even protocols
> to provide type accessors as well as property accessors, Lazy, Optional,
> and ImplicitlyUnwrappedOptional could then be implemented like this:
> struct Lazy<T> {
>     // or whatever the magic syntax is
>     mutating static get { () -> T in // $0 is an instance of Lazy<T>
> if $0.value == nil { $0.value = $0.closure() }
> return $0.value!
>     }
>     mutating static set { (newValue:T) in $0.value = newValue }
>
>     private let closure: () -> T
>     private var value: T? = nil
>     init(_ closure: () -> T) {
>         self.value = closure
>     }
> }
> enum Optional<T> {
>     // no need for a custom getter, since you have to manually unwrap
> optionals
>     mutating static set { (newValue: T) in $0 = .Some(newValue) } // $0
> is an instance of Optional<T>
>     mutating static set { () in $0 = .None }
>
>     case None
>     case Some(T)
>     init() { self = .None }
>     init(nilLiteral: ()) { self = .None }
>     init(_ value: T) { self = .Some(value) }
> }
> enum ImplicitlyUnwrappedOptional<T> {
>     mutating static get { () -> T in // $0 is an instance of
> ImplicitlyUnwrappedOptional<T>
>         switch $0 {
>         case .None: fatalError("Error unwrapping
> ImplicitlyUnwrappedOptional")
>         case .Some(let value): return value
>         }
>     }
>     mutating static set { (newValue: T) in $0 = .Some(newValue) }
>     mutating static set { () in $0 = .None }
>
>     case None
>     case Some(T)
>     init() { self = .None }
>     init(nilLiteral: ()) { self = .None }
>     init(_ value: T) { self = .Some(value) }
> }
>
> One of the stated goals of Swift 3 is to move stuff out of the core
> language and into the standard library, right? Well, this would get rid of
> all the “magic” behind Lazy, Optionals, and ImplicitlyUnwrappedOptionals
> *and* it’d let us implement our own type-related custom behaviors. It’s a
> win-win!
>
>
> Getting rid of magic is definitely a goal, but I think we want to go in
> the *opposite* direction. Implicit Optional promotion creates lots of
> problems, and ImplicitlyUnwrappedOptional's behavior can be hard to
> predict. We plan to reform the type system around both kinds of Optional
> soon. Behaviors also give us an opportunity to eliminate at least one case
> for IUO by modeling delayed initialization as a behavior. I'd prefer not to
> introduce more messy implicit promotions.
>
> -Joe
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160119/6cd651c3/attachment-0001.html>


More information about the swift-evolution mailing list