> On Mar 23, 2016, at 3:45 PM, Joseph Pamer <[email protected]> wrote:
> 
> 
>> On Mar 23, 2016, at 11:29 AM, Jordan Rose <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> The most common use case I've seen for this has been drilling into a 
>> heterogeneous collection without specifying intermediate types, i.e. 
>> `pluginProperties["actions"][0]["name"]`. Some possible variations on this 
>> proposal could continue to allow that:
>> 
>> - Remove all lookup except the subscripts `(AnyObject) -> AnyObject?` and 
>> `(Int) -> AnyObject`.
>> - Instead of removing AnyObject lookup completely (the proposal), change the 
>> IUO-wrapped results (the current behavior) to use Optional, requiring 
>> developers to explicitly deal with the possibility of failure.
>> - Both of the above.
>> 
>> I know Joe Pamer has been looking into seeing how this feature is used by 
>> introducing a warning for it in the type checker. Before making any changes 
>> here we'd want to know how it affects real-world projects.
> 
> I should be pushing a branch that does both of the above “real soon now”. 
> (This branch also includes my recent experiments in inhibiting implicit 
> bridging conversions.) I’ll be curious to know what people think once they’ve 
> had a chance to play with these changes.
> 
> Thanks!
> - Joe
> 

Good to hear! Is this change going to make this work on linux/etc so that 
behavior is consistent on all platforms too?

If it turns out that it's not practical to remove this behavior outright, what 
if we move the behavior to a new type that has this expectation built in, 
perhaps `ObjcObject` or something similar? If the importer keeps every use of 
`id` from objective-c imported as AnyObject, then a developer could opt-in to 
this behavior by casting to ObjcObject explicitly:

for thing in things {
        (thing as ObjcObject).bar()
}

If we can't get this behavior to work on all platforms, exposing it through a 
dedicated ObjcObject type like this would help identify whether code that uses 
it is able to be used cross platform or not.

>> 
>> Jordan
>> 
>> 
>>> On Mar 22, 2016, at 18:59 , Kevin Lundberg via swift-evolution 
>>> <[email protected] <mailto:[email protected]>> wrote:
>>> 
>>> In "Using Swift with Cocoa and Objective-C", this behavior is described as 
>>> part of how AnyObject works:
>>> 
>>> “You can also call any Objective-C method and access any property without 
>>> casting to a more specific class type." … "However, because the specific 
>>> type of an object typed as AnyObject is not known until runtime, it is 
>>> possible to inadvertently write unsafe code. As in Objective-C, if you 
>>> invoke a method or access a property that does not exist on an AnyObject 
>>> typed object, it is a runtime error.”
>>> 
>>> I propose that we remove this behavior entirely to push swift further in 
>>> the direction of type safety.
>>> 
>>> Rationale:
>>> Even if you don’t mean to write code that relies on this behavior, it's 
>>> easy to accidentally do so when interfacing with various Cocoa APIs due to 
>>> type inference. A developer may not even realize that their code is unsafe 
>>> since their code will compile just fine when calling obj-c visible methods. 
>>> Removing this behavior would alleviate any confusion that a developer may 
>>> have while writing this, especially as it is not a highly advertised 
>>> feature of AnyObject. Furthermore, anyone who reads swift code using this 
>>> will know with more certainty what types the author expects to be using 
>>> here since an explicit cast will be required.
>>> 
>>> Considerations:
>>> If this is done, the way I see AnyObject behaving is similar to Any, where 
>>> you need to manually downcast in order to call methods on things. Code 
>>> would change from this:
>>> 
>>> 
>>> class Foo: NSObject { func bar() {} }
>>> let things = NSOrderedSet(object: Foo())
>>> 
>>> for thing in things { // thing is AnyObject
>>>     thing.bar() // happens to work but not verified by compiler, may crash 
>>> in the future
>>> }
>>> 
>>> 
>>> to something like this:
>>> 
>>> //...
>>> 
>>> for thing in things {
>>>     if let foo = thing as? Foo { // needs an explicit cast
>>>             foo.bar() // type checked, verified by compiler, won’t crash 
>>> due to missing method
>>>         }
>>> }
>>> 
>>> 
>>> One ancillary benefit that I can see of doing this is that it could make 
>>> AnyObject consistent across darwin and other platforms. As far as I can 
>>> tell, this behavior only exists on platforms where swift integrates with 
>>> the objective-c runtime, and doing this will help swift code be more 
>>> portable as it doesn’t rely on this implicit behavior.
>>> 
>>> Any thoughts?
>>> 
>>> --
>>> Kevin Lundberg
>>> [email protected] <mailto:[email protected]>
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected] <mailto:[email protected]>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
> 

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to