This:
> - (void)resetSheet:(id)sender {
> if ([sender respondsToSelector:@selector(property)]) {
> PMProperty * selectedProperty = [sender performSelector:@selector(property)];
>
> if (selectedProperty) {
> self.tenure.property = (PMProperty *)[self.managedObjectContext objectWithID:selectedProperty.objectID];
> }
> }
> }
Has very different semantics from this:
> override func resetSheet(sender: AnyObject!) {
> if let selectedProperty = sender.property {
> self.propertyTransaction?.property = self.managedObjectContext.objectWithID(selectedProperty.objectID) as? PMProperty
> }
> }
The Objective-C code tests if sender has a property (really, a method) named “property”, and if it does, calls it and does something with the value if it’s not nil. The Swift code just calls “property”, *assuming* that sender is not nil and has a “property” property, and tests if the value is nil.
A direct translation of the Objective-C might look more like:
override func resetSheet(sender: AnyObject?) {
if let selectedProperty = sender?.property? {
self.propertyTransaction?.property = self.managedObjectContext.objectWithID(selectedProperty.objectID) as? PMProperty
}
}
The question mark after “sender" indicates that “sender" might be nil, and the one after “property” indicates that “sender” might not have a “property” property. However, this doesn't actually compile in my playground—Swift doesn’t allow typing this loose.
You’re much better off giving “sender” a specific type:
override func resetSheet(sender: PMPropertyController?) {
if let selectedProperty = sender?.property {
self.propertyTransaction?.property = self.managedObjectContext.objectWithID(selectedProperty.objectID) as? PMProperty
}
}
Or if you can’t guarantee the type of “sender” (or you can’t change the AnyObject in your superclass for some reason), use a type check:
override func resetSheet(sender: AnyObject?) {
if let propertyController = sender as? PMPropertyController, selectedProperty = propertyController.property {
self.propertyTransaction?.property = self.managedObjectContext.objectWithID(selectedProperty.objectID) as? PMProperty
}
}
If “sender” can be one of several unrelated types, all of which have a “property” property, declare a PropertyHoldingType protocol that requires the “property” property and make all of the valid types conform to it. Then you can either make resetSheet(_:) take an instance of PropertyHoldingType, or do an “if let”/“as?” conditional cast to PropertyHoldingType.
HTH,
--
Brent Royal-Gordon
Architechies