SGTM!

-Chris

> On Jan 17, 2018, at 3:14 PM, Connor Wakamo <cwak...@apple.com> wrote:
> 
> 
> 
>> On Jan 12, 2018, at 11:02 PM, Chris Lattner <clatt...@nondot.org 
>> <mailto:clatt...@nondot.org>> wrote:
>> 
>>> On Jan 12, 2018, at 6:22 PM, Connor Wakamo <cwak...@apple.com 
>>> <mailto:cwak...@apple.com>> wrote:
>>> 
>>>>> The second case, and the one I’m more worried about, is subclassing. If, 
>>>>> for instance, you have the following:
>>>>> 
>>>>>   class FooView: UIView, CustomPlaygroundRepresentable {
>>>>>           var playgroundRepresentation: Any {
>>>>>                   return “A string describing this view"
>>>>>           }
>>>>>   }
>>>>> 
>>>>>   class BarView: FooView {
>>>>>           override var playgroundRepresentation: Any {
>>>>>                   // BarView instances wanted to be logged as themselves, 
>>>>> but there’s no way to express that
>>>>>                   return ???
>>>>>           }
>>>>>   }
>>>>> 
>>>>> There’s nothing that BarView can do to ensure it gets logged like a view 
>>>>> because FooView declared a conformance to CustomPlaygroundRepresentable.
>>>> 
>>>> I really don’t understand this.  FooView declares that it conforms, and it 
>>>> provides a “playgroundRepresentation” member.  Cool for FooView.
>>>> 
>>>> BarView comes around and overrides FooView’s implementation.  They don’t 
>>>> have to conform, because it *isa* FooView, so of course it conforms.  If 
>>>> it wants to customize its presentation, it overrides its  
>>>> “playgroundRepresentation” method and it… just works.  If it conditionally 
>>>> wants the FooView representation for some reason, it can even call 
>>>> “super.playgroundRepresentation”.  What’s the problem?  This seems ideal 
>>>> to me.
>>> 
>>> The issue is that there’s no way for `BarView` to recover the default 
>>> playground representation which `UIView` and its subclasses get.
>> 
>> I get it now, thanks.
>> 
>>> For a `UIView`, the PlaygroundLogger library renders an image of the view 
>>> and packages that up in a log entry. If `BarView` wants that instead of 
>>> `FooView`’s custom representation, there’s no way for it to request it.
>> 
>> I can think of two different ways to solve this problem:
>> 
>> 1) Go with your suggestion upthread, where a custom enum is used: 
>> implementations do:
>> 
>>   if predicate() {
>>     return .custom(“my representation)
>>   } else {
>>     return .default
>>   }
>> 
>> The problem with this is that you’re forcing implementations of this to deal 
>> with the enum just because of the rare case.  Not a showstopper, but doesn’t 
>> feel right.
>> 
>> 2) Go with the simple approach of returning Any, and add a new function to 
>> the Playground API somewhere that produces the default representation that 
>> they can call, the unusual case above would look like this:
>> 
>>   if predicate() {
>>     return “my representation
>>   } else {
>>     return SomePlaygroundAPI.getDefaultPlaygroundRepresentation(self)
>>   }
>> 
>> This seems like the best of both worlds to me.
> 
> Yes, agreed. I’m not going to propose adding this to PlaygroundSupport as 
> part of this proposal (under the assumption that this is an extreme edge case 
> to begin with), but I’ll include a reference to it in the “alternatives 
> considered” section so it can be referenced in the future should this be 
> important enough that it warrants support.
> 
>>>> IMO, every time you choose to privilege “well known” types in the standard 
>>>> library with special code in Xcode (or some other high level system 
>>>> loosely integrated with swift.org <http://swift.org/>) you are introducing 
>>>> technical debt into the Swift ecosystem.  This is because you are 
>>>> violating the basic principles on which Swift was established, which is 
>>>> that users can [re]define primitives to build their own abstractions and 
>>>> carve out new domains beyond what was originally envisioned when you’re 
>>>> writing the UI code.
>>> 
>>> So given that, I think it’s not unreasonable for a platform/toolchain’s 
>>> playground logger to know about that platform/toolchain’s important types 
>>> so it can produce the appropriate opaque log entries. If there’s some 
>>> approach that I’m overlooking — or if I’m dismissing the suite of protocols 
>>> case too quickly — I would love to hear it, because I’m open to suggestions.
>> 
>> Yes, you are completely right: Unless you are willing to make the structured 
>> schema public, there is no point to doing what I suggest.
>> 
>> I do think that there is a schema which would make sense to take public 
>> (similar to the abstract format used in treeviews like the navigator and UI 
>> debugger for variables, strikingly similar to what JSON can express with a 
>> fancier terminal than strings), but there is no rush to do that, and it is 
>> best to take time to consider it deliberately.
> 
> Likewise, agreed — I don’t want to try to figure out what that would look 
> like with the time pressure imposed by trying to get this in Swift 4.1 prior 
> to ABI stability. And even in a world where this is exposed in a way to allow 
> custom implementations at that low level, I think that a 
> `CustomPlaygroundConvertible`-style API is still useful as the simple way of 
> customizing display for most clients.
> 
> Connor
> 
>>>> Is the problem the “one” case?  If that is the problem, then it might be 
>>>> better to take a completely different approach where you embrace the fact 
>>>> that you have structured data producing 2D results that need to be 
>>>> displayed.  Each result could either return an atomic result or a result 
>>>> that wraps some other recursive 2D presentation.
>>> 
>>> No, the issue is that the playground logger would see that `Foo.two` 
>>> conforms to `CustomPlaygroundConvertible`, and would therefore call 
>>> `playgroundDescription` another time, which would return another `Foo.two`, 
>>> and this would continue endlessly. I plan to guard against that in 
>>> PlaygroundLogger with a limit on chaining, but this protocol should not 
>>> require a failsafe as a feature.
>> 
>> Right, it seems like the best way to solve this is to provide explicit 
>> access to the default presentation.
>> 
>> -Chris
>> 
> 

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

Reply via email to