Post on 19-Jan-2017
COMBINING SWIFT ANDOBJECTIVE-C
AGENDA
Using Objective-C from Swift
Using Swift from Objective-C
Objective-C Behavior in Swift Classes
IMPORTING OBJECTIVE-C INTO SWIFT
APPLE FRAMEWORKS
No additional setup required!
import UIKitimport Foundation
OBJECTIVE-C WITHIN SAME TARGETAdd Objective-C files to the Bridging-Header
Bridging-Header needs to be referenced in build settings
Project-Bridging-Header.h
A.swift B.swift
MyObj.h
Car.h
MyObj.m
Car.m
THIRD PARTY FRAMEWORKS
If framework is built as a module:
No additional setup required
import Parse
THIRD PARTY FRAMEWORKS
If framework is written in Obj-C
And framework is not built as a module
Add framework header to bridging-header:
#ifndef Makestagram_Makestagram_Bridging_Header_h#define Makestagram_Makestagram_Bridging_Header_h
#import <Parse/Parse.h>
#endif
CALLING OBJECTIVE-C FROM SWIFT
CALLING OBJ-C FROM SWIFT
Most syntax translates almost 1-1
Special rules for initializers
INITIALIZERS
[[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
UITableView(frame: CGRectZero, style: .Grouped)
[UIColor colorWithRed:0.5 green:0.0 blue:0.5 alpha:1.0];
UIColor(red: 0.5, green: 0.0, blue: 0.5, alpha: 1.0)
METHODS
[myTableView insertSubview:mySubview atIndex:2];
myTableView.insertSubview(mySubview, atIndex: 2)
PROPERTIES
myTextField.textColor = UIColor.darkGrayColor()
OPTIONALITY IN OBJ-C
Since latest release of Objective-C we can
specify whether values can be nil or not
For unaudited APIs: Implicitly unwrapped
Optionals by default!
OPTIONALITY IN OBJ-C
// unaudited version -> generates warning+ (UIView *)createViewWithName:(NSString *)name;
// return value and argument are non-optional+ (__nonnull UIView *)createViewWithNameSwiftier:(__nonnull NSString *)name;
// return value and argument are optional+ (__nullable UIView *)createViewWithNameSwiftierNullable:(__nullable NSString *)name;
USING SWIFT FROM OBJECTIVE-C
SWIFT WITHIN SAME TARGET
AppName-Swift.hA.swift
B.swift
MyObj.h Car.h
MyObj.m Car.m
NSOBJECT SUBCLASSES
class SimpleNSObject: NSObject { }
#import "InteropTest-Swift.h"
- (void)test { SimpleNSObject *simple2 = [[SimpleNSObject alloc] init];}
SWIFT ROOT CLASS@objc public class Simple { public class func newInstance() -> Simple { return Simple() }}
#import "InteropTest-Swift.h"
- (void)test { Simple *simple = [Simple newInstance];}
OBJECTIVE-C BEHAVIOR IN SWIFT CLASSES
OBJECTIVE-C BEHAVIOR IN SWIFT CLASSES
class User { dynamic var name: String dynamic func setUp() { //... } }
Use the dynamic keyword to enable Objective-Cfeatures such as KVO and performSelector:
ADDITIONAL RESOURCES
Using Swift with Cocoa and Objective-C (Apple)
Mike Ash Talk: Swift and C
Russ Bishop Talk: Unsafe Swift