Swift Objective-C Interop

Post on 19-Jan-2017

382 views 0 download

Transcript of Swift Objective-C Interop

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