[swift-evolution] [Pitch] inout with capture variable
Mark Lacey
mark.lacey at apple.com
Thu Oct 6 00:15:37 CDT 2016
> On Oct 5, 2016, at 10:07 PM, Cao Jiannan <frogcjn at 163.com> wrote:
>
> so if developer want to capture an variable inference, must declare a new variable.
I don’t follow what you mean here.
>
> class A {
> var value = 1
>
> func test() -> () -> Int {
> var capturedValue = self.value
> let editInfo = { () -> Int in
> capturedValue += 1
> return capturedValue
> }
> return editInfo
> }
> }
>
> let a = A()
>
> let editInfo = a.test()
> print(editInfo()) // 2
> print(a.value) // 1
> print(editInfo()) // 3
> print(a.value) // 1
>
> what about:
>
> class A {
> var value = 1
>
> func test() -> () -> Int {
> let editInfo = { [inout value] () -> Int in
> capturedValue += 1
> return capturedValue
> }
> return editInfo
> }
> }
>
> let a = A()
>
> let editInfo = a.test()
> print(editInfo()) // 2
> print(a.value) // 2
> print(editInfo()) // 3
> print(a.value) // 3
I’m not quite sure what you’re getting at, but this prints what you’re expecting in the output you have in the comments:
class A {
var value = 1
func test() -> () -> Int {
let editInfo = { () -> Int in
self.value += 1
return self.value
}
return editInfo
}
}
let a = A()
let editInfo = a.test()
print(editInfo()) // 2
print(a.value) // 2
print(editInfo()) // 3
print(a.value) // 3
Mark
>
> > > On Oct 5, 2016, at 9:06 PM, Cao Jiannan via swift-evolution<swift-evolution at swift.org <mailto:swift-evolution at swift.org>>wrote:
> > >
> > > for example:
> > >
> > > var a = 1
> > >
> > > let block = { [inout a] in
> > > a += 1
> > > }
> > >
> > > block()
> > > block()
> > >
> > > print(a) // 3
> > This is already how captures work by default in closures and nested functions in Swift:
> >
> > var a = 1
> >
> > let block = { a += 1 }
> >
> > block()
> > block()
> >
> > print(a) // prints 3
> >
> >
> > If you want to capture something immutably you can put it in the capture list:
> >
> > var a = 1
> > let block = { [a] in a += 1 } // error: left side of mutating operator isn't mutable: 'a' is a 'let' constant
> >
> > Mark
> >
> > >
> > >
> > > _______________________________________________
> > > swift-evolution mailing list
> > > swift-evolution at swift.org <mailto:swift-evolution at swift.org>
> > > https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> >
> >
> >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161005/9a39f869/attachment.html>
More information about the swift-evolution
mailing list