[swift-users] Implicitly capture a mutating self

Richard Wei rxrwei at gmail.com
Fri Dec 16 03:05:55 CST 2016


It’s not the correct choice here :)

> On Dec 16, 2016, at 03:04, Rien <Rien at Balancingrock.nl> wrote:
> 
> Just because it is called “Unsafe” does not mean it is unsafe :-)
> It all depends on how you use it.
> 
> Regards,
> Rien
> 
> Site: http://balancingrock.nl
> Blog: http://swiftrien.blogspot.com
> Github: http://github.com/Swiftrien
> Project: http://swiftfire.nl
> 
> 
> 
> 
>> On 16 Dec 2016, at 09:52, Richard Wei <rxrwei at gmail.com> wrote:
>> 
>> Zhao, it’s not a class.
>> 
>> Rien, unsafe pointers is the last thing I would ever want to introduce in my library…
>> 
>> Capturing self was clean, working perfectly, until Swift 3.0.2.
>> 
>> -Richard
>> 
>>> On Dec 16, 2016, at 02:49, Zhao Xin <owenzx at gmail.com> wrote:
>>> 
>>> What is the type of self? If it is a class, try [unowned self].
>>> 
>>> Zhaoxin
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> On Fri, Dec 16, 2016 at 4:33 PM, Rien via swift-users <swift-users at swift.org> wrote:
>>> How about using:
>>> 
>>> UnsafeMutablePointer<TypeOfSelf>
>>> 
>>> ?
>>> 
>>> Regards,
>>> Rien
>>> 
>>> Site: http://balancingrock.nl
>>> Blog: http://swiftrien.blogspot.com
>>> Github: http://github.com/Swiftrien
>>> Project: http://swiftfire.nl
>>> 
>>> 
>>> 
>>> 
>>>> On 16 Dec 2016, at 09:10, Richard Wei via swift-users <swift-users at swift.org> wrote:
>>>> 
>>>> Capturing makes it immutable, which unfortunately can't solve this problem.
>>>> 
>>>> -Richard
>>>> 
>>>>> On Dec 16, 2016, at 02:05, Zhao Xin <owenzx at gmail.com> wrote:
>>>>> 
>>>>> I did not test the code. But if you cannot implicitly capture a mutating self, you should do it explicitly, right?
>>>>> 
>>>>> let blockSize = min(512, count)
>>>>> let blockCount = (count+blockSize-1)/blockSize
>>>>> device.sync { [self] () -> () in // Launch CUDA kernel
>>>>>    try! fill<<<(blockSize, blockCount)>>>[
>>>>>        .pointer(to: &self), .value(value), .value(Int64(count))
>>>>>    ]
>>>>> }
>>>>> 
>>>>> Hope above code works.
>>>>> 
>>>>> Zhaoxin
>>>>> 
>>>>> On Fri, Dec 16, 2016 at 3:46 PM, Richard Wei via swift-users <swift-users at swift.org> wrote:
>>>>> Hi,
>>>>> 
>>>>> Swift 3.0.2 seems to have broken my code due to mutating self capture. But I have to pass inout self to the closure. Any workaround?
>>>>> 
>>>>>    let blockSize = min(512, count)
>>>>>    let blockCount = (count+blockSize-1)/blockSize
>>>>>    device.sync { // Launch CUDA kernel
>>>>>        try! fill<<<(blockSize, blockCount)>>>[
>>>>>            .pointer(to: &self), .value(value), .value(Int64(count))
>>>>>        ]
>>>>>    }
>>>>> 
>>>>> <PastedGraphic-1.png>
>>>>> 
>>>>> -Richard
>>>>> 
>>>>> _______________________________________________
>>>>> swift-users mailing list
>>>>> swift-users at swift.org
>>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>>>> 
>>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-users mailing list
>>>> swift-users at swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-users
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users at swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-users
>>> 
>> 
> 



More information about the swift-users mailing list