> On May 27, 2016, at 5:19 PM, Brent Royal-Gordon via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
>>> - A plain `with` whose closure parameter is not mutable and which is marked 
>>> `@discardableResult`.
>> 
>> I would like to see this version restricted to AnyObject.  It has extremely 
>> limited utility with value types.  It would usually be a mistake to call it 
>> with a value type.
> 
> I would not. It gives you a way to give a value type a short, scoped, 
> immutable alias:
> 
>       with(RareMagicalDeviceOwner.shared.spimsterWickets[randomIndex]) {
>               print($0.turns)
>               print($0.turnSpeed)
>       }
> 
> And in this form, there is no danger of mistakenly mutating the value type, 
> because mutating methods would not be allowed:
> 
>       with(RareMagicalDeviceOwner.shared.spimsterWickets[randomIndex]) {
>               $0.turnRepeatedly(times: 3)     // Error: can't call mutating 
> method on immutable parameter
>       }
> 
> To be clear, I'm not convinced there's a need to make any change from the 
> proposed version at all. I'm spitballing alternate designs here, trying to 
> see if there might be something a little better out there. But so far, I 
> think the proposal balances the feature size against strictness pretty well, 
> whereas these stricter designs I'm discussing increase the surface of the 
> feature more than they improve it. This is a small (but significant!) 
> convenience, and I feel pretty strongly that it should have a small 
> implementation.
> 
>> That said, I am not convinced these non-copying functions would be worth 
>> having after method cascades are introduced.  Are there any use cases left 
>> for them in that future?
> 
> Yes, absolutely. Method cascades have a narrow use case: methods on `self`. 
> Not everything in Swift is a method, and not all methods are on `self`.
> 
>       with(tableView.cellForRow(at: indexPath).myLabel) { label in
>               print("Constraining label: \(label)")
>               
>               NSLayoutConstraint.activate(
>                       NSLayoutConstraint.withVisualFormat("|-[label]-|", 
> options: [], metrics: [:], views: ["label": label]) +
>                       NSLayoutConstraint.withVisualFormat("V:|[label]|", 
> options: [], metrics: [:], views: ["label": label])
>               )
>               
>               constrainedLabels.append(label)
>       }
> 
> None of the calls in that `with` block would benefit from method cascades, 
> but they all benefit from `with`.

What are the differences or benefits of the above examples over the existing 
`do { let ... }` form?

    do {
      let w = RareMagicalDeviceOwner.shared.spimsterWickets[randomIndex]
      print(w.turns)
      print(w.turnSpeed)
    }

    do {
      let label = tableView.cellForRow(at: indexPath).myLabel
      print("Constraining label: \(label)")
      NSLayoutConstraint.activate(
        NSLayoutConstraint.withVisualFormat("|-[label]-|", options: [], 
metrics: [:], views: ["label": label]) +
        NSLayoutConstraint.withVisualFormat("V:|[label]|", options: [], 
metrics: [:], views: ["label": label])
      )
      constrainedLabels.append(label)
    }


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler


_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to