Hi John,

Thanks for filing the bug.

The root cause of the issue is that the importer would turn the following 
methods into the same name:

- (void)encodeInt:(int)x forKey:(NSString *)k;
- (void)encodeInt32:(uint32_t)x forKey:(NSString *)k;

Plus, there is the added confusion that this method:

- (void)encodeInteger:(NSInteger)x forKey:(NSString *)k;

is imported into Swift like this:

func encode(_ x: Int, forKey k : String)

where, as you can see, “Int” means “NSInteger”, but not the C “int”.

I’m not really sure how to resolve this and still allow for subclassing without 
simply reverting these names back to Swift 2.2 style, so I think that’s 
probably what I’ll have to do:

func encodeInt(_ x : Int32, forKey k : String)
func encodeInt32(_ x : Int32, forKey k : String)
func encodeInt64(_ x : Int64, forKey k : String)
func encodeInteger(_ x : Int, forKey k : String)

and so on, for all of the encode methods, so they are consistent.

- Tony

> On Jul 19, 2016, at 8:20 AM, John Spurlock <john.spurl...@gmail.com> wrote:
> 
> Ok, filed a new bug for the encodeInt:forKey issue:  rdar://problem/27425997
> 
> Ensured it reproduces in xcode beta 3, swift version 3.0 
> (swiftlang-800.0.34.6 clang-800.0.33)
> 
> Is there anything I can do in the meantime as a swift-only workaround to fix 
> my custom NSCoder?
> 
> Thanks,
> - john
> 
> On Mon, Jul 18, 2016 at 10:52 PM, Tony Parker <anthony.par...@apple.com 
> <mailto:anthony.par...@apple.com>> wrote:
> We renamed some of these methods for Swift 3 in an attempt to remove some of 
> the confusion surrounding which of these did what - they were really named 
> for C types and not Swift ones.
> 
> encodeInt:forKey: and decodeInt:forKey: are the two missing ones, since they 
> were easily confused with the Swift Int type. I think we’ll have to figure 
> out a different approach here. John, please file a bug at bugreport.apple.com 
> <http://bugreport.apple.com/> and let me know the radar number, and we’ll 
> look into it.
> 
> Thanks,
> - Tony
> 
> > On Jul 18, 2016, at 6:33 PM, Brent Royal-Gordon <br...@architechies.com 
> > <mailto:br...@architechies.com>> wrote:
> >
> >> Hi Tony - when I add that attribute, I get an error at compile-time:
> >> Objective-C method has a different selector from the method it overrides 
> >> ('encodeInt:forKey:' vs. 'encodeInteger:forKey:')
> >>
> >> If I update to encodeInteger:forKey as the fix describes, it compiles, but 
> >> I'm getting the same original problem at runtime.  i.e. "encodeInt:forKey: 
> >> only defined for abstract class"
> >>
> >> Any other ideas?  See the same thing over there?  You should be able to 
> >> paste that into a new swift 3 test.
> >
> > If you look at the NSCoder documentation, you'll see 25 methods in the 
> > Swift version of the "Encoding General Data" section, and 27 
> > (non-deprecated) in the Objective-C version. `-encodeInt:forKey:` has no 
> > Swift equivalent. I'm not sure what the other missing method is.
> >
> > I think this is probably a bug or design oversight, and I'd recommend you 
> > file a radar against Foundation. If this is a primitive method for 
> > NSCoding, it needs to be accessible from Swift.
> >
> > --
> > Brent Royal-Gordon
> > Architechies
> >
> 
> 

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

Reply via email to