Documente Academic
Documente Profesional
Documente Cultură
Session 407
Doug Gregor
Engineer, Swift Compiler Team
2014 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
#WWDC14
Introduction
Swift is a new language for Cocoa
Seamless interoperability with Objective-C
Focus on language-level interoperability
Roadmap
Working with Cocoa
How Objective-C APIs look and feel in Swift
id and AnyObject
- (instancetype)initWithFileURL:(NSURL *)url;
!
@end
Properties
Objective-C
Properties
Objective-C
Swift
var fileModificationDate: NSDate!
Intermediate Swift
Presidio
Wednesday 2:00PM
Intermediate Swift
Presidio
Wednesday 2:00PM
Intermediate Swift
Presidio
Wednesday 2:00PM
Swift
var fileType: String! { get }
Swift Equivalent
BOOL
Bool
NSInteger
Int
SEL
Selector
id
AnyObject!
Class
AnyClass!
NSString *
String!
NSArray *
AnyObject[]!
Methods
Objective-C
- (NSString *)fileNameExtensionForType:(NSString *)typeName
saveOperation:(UIDocumentSaveOperation)saveOperation;
Methods
Objective-C
- (NSString *)fileNameExtensionForType:(NSString *)typeName
saveOperation:(UIDocumentSaveOperation)saveOperation;
Swift
func fileNameExtensionForType(typeName: String!,
saveOperation: UIDocumentSaveOperation) -> String!
Methods
Argument labels
Objective-C
- (NSString *)fileNameExtensionForType:(NSString *)typeName
saveOperation:(UIDocumentSaveOperation)saveOperation;
Swift
func fileNameExtensionForType(typeName: String!,
saveOperation: UIDocumentSaveOperation) -> String!
Methods
Argument labels in calls
Objective-C
- (NSString *)fileNameExtensionForType:(NSString *)typeName
saveOperation:(UIDocumentSaveOperation)saveOperation;
Swift
func fileNameExtensionForType(typeName: String!,
saveOperation: UIDocumentSaveOperation) -> String!
Usage
let ext = document.fileNameExtensionForType("public.presentation",
saveOperation: UIDocumentSaveOperation.ForCreating)
Methods
Objective-C
- (void)saveToURL:(NSURL *)url
forSaveOperation:(UIDocumentSaveOperation)saveOperation
completionHandler:(void (^)(BOOL success))completionHandler;
Methods
Objective-C
- (void)saveToURL:(NSURL *)url
forSaveOperation:(UIDocumentSaveOperation)saveOperation
completionHandler:(void (^)(BOOL success))completionHandler;
Swift
func saveToURL(url: NSURL!,
forSaveOperation saveOperation: UIDocumentSaveOperation,
completionHandler: ((success: Bool) -> Void)!)
Methods
Argument labels and internal parameter names
Objective-C
- (void)saveToURL:(NSURL *)url
forSaveOperation:(UIDocumentSaveOperation)saveOperation
completionHandler:(void (^)(BOOL success))completionHandler;
Swift
func saveToURL(url: NSURL!,
forSaveOperation saveOperation: UIDocumentSaveOperation,
completionHandler: ((success: Bool) -> Void)!)
Methods
Argument labels and internal parameter names
Objective-C
- (void)saveToURL:(NSURL *)url
forSaveOperation:(UIDocumentSaveOperation)saveOperation
completionHandler:(void (^)(BOOL success))completionHandler;
Swift
func saveToURL(url: NSURL!,
forSaveOperation saveOperation: UIDocumentSaveOperation,
completionHandler: ((success: Bool) -> Void)!)
Methods
Blocks and closures
Objective-C
- (void)saveToURL:(NSURL *)url
forSaveOperation:(UIDocumentSaveOperation)saveOperation
completionHandler:(void (^)(BOOL success))completionHandler;
Swift
func saveToURL(url: NSURL!,
forSaveOperation saveOperation: UIDocumentSaveOperation,
completionHandler: ((success: Bool) -> Void)!)
Methods
Swift
func saveToURL(url: NSURL!,
forSaveOperation saveOperation: UIDocumentSaveOperation,
completionHandler: ((success: Bool) -> Void)!)
Methods
Trailing closure syntax
Swift
func saveToURL(url: NSURL!,
forSaveOperation saveOperation: UIDocumentSaveOperation,
completionHandler: ((success: Bool) -> Void)!)
Methods
Trailing closure syntax
Swift
func saveToURL(url: NSURL!,
forSaveOperation saveOperation: UIDocumentSaveOperation,
completionHandler: ((success: Bool) -> Void)!)
Usage
document.saveToURL(documentURL,
saveOperation: UIDocumentSaveOperation.ForCreating) {
success in
if success { } else { }
Initializers
Objective-C
- (instancetype)initWithFileURL:(NSURL *)url;
Initializers
Objective-C
- (instancetype)initWithFileURL:(NSURL *)url;
Swift
init(fileURL url: NSURL!)
Initializers
Objective-C
- (instancetype)initWithFileURL:(NSURL *)url;
Swift
init(fileURL url: NSURL!)
Initializers
Objective-C
- (instancetype)initWithFileURL:(NSURL *)url;
Swift
init(fileURL url: NSURL!)
Initializers
Objective-C
- (instancetype)initWithFileURL:(NSURL *)url;
Swift
Creating Objects
Objective-C
- (instancetype)initWithFileURL:(NSURL *)url;
Creating Objects
Objective-C
- (instancetype)initWithFileURL:(NSURL *)url;
Swift
init(fileURL url: NSURL!)
let document = UIDocument(fileURL: documentURL)
Factory Methods
Objective-C
Factory Methods
Objective-C
Factory Methods
Objective-C
Swift
class func colorWithRed(red: CGFloat, green: CGFloat, blue: CGFloat,
alpha: CGFloat) -> UIColor!
Factory Methods
Objective-C
Swift
class func colorWithRed(red: CGFloat, green: CGFloat, blue: CGFloat,
alpha: CGFloat) -> UIColor!
let color = UIColor.colorWithRed(1, green: 0.67, blue: 0.04, alpha: 0)
Swift
init(red:
Swift
init(red:
let
Enums
Objective-C
Enums
Objective-C
Enums
Objective-C
typedef NS_ENUM(NSInteger, UIDocumentSaveOperation) {
UIDocumentSaveForCreating,
UIDocumentSaveForOverwriting
};
Swift
enum UIDocumentSaveOperation : Int {
case ForCreating
case ForOverwriting
Swift
enum UIDocumentSaveOperation : Int {
case ForCreating
case ForOverwriting
Usage
let ext = document.fileNameExtensionForType("public.presentation",
saveOperation:
Using Enums
Swift
enum UIDocumentSaveOperation : Int {
case ForCreating
case ForOverwriting
Usage
let ext = document.fileNameExtensionForType("public.presentation",
saveOperation: UIDocumentSaveOperation .ForCreating)
Using Enums
Swift
enum UIDocumentSaveOperation : Int {
case ForCreating
case ForOverwriting
Usage
let ext = document.fileNameExtensionForType("public.presentation",
saveOperation: .ForCreating)
NSError
Objective-C
NSError
Objective-C
Swift
Swift
Using NSError
Swift
Using NSError
Swift
Usage
var error: NSError?
if let contents = document.contentsForType("public.presentation",
error: &error) {
// use the contents
}
Using NSError
Swift
Usage
var error: NSError?
if let contents = document.contentsForType("public.presentation",
error: &error) {
// use the contents
} else if let actualError = error {
// handle error
}
Marina
Wednesday 9:00AM
id and AnyObject
id in Objective-C
Upcasts
id object = [[NSURL alloc] initWithString:@"http://developer.apple.com"];
object = view.superview;
id in Objective-C
Upcasts
id object = [[NSURL alloc] initWithString:@"http://developer.apple.com"];
object = view.superview;
Message sends
[object removeFromSuperview];
id in Objective-C
Upcasts
id object = [[NSURL alloc] initWithString:@"http://developer.apple.com"];
object = view.superview;
Message sends
[object removeFromSuperview];
Subscripting
id date = object[@"date"];
Message sends
[object removeFromSuperview];
Subscripting
id date = object[@"date"];
object = view.superview
Message sends
[object removeFromSuperview];
Subscripting
id date = object[@"date"];
object = view.superview
Message sends
object.removeFromSuperview()
Subscripting
id date = object[@"date"];
object = view.superview
Message sends
object.removeFromSuperview()
Subscripting
let date = object["date"]
respondsToSelector Idiom
Messaging id or AnyObject can result in unrecognized selector failures
[object removeFromSuperview];
respondsToSelector Idiom
Messaging id or AnyObject can result in unrecognized selector failures
[object removeFromSuperview];
Downcasting AnyObject
AnyObject does not implicitly downcast
let view: UIView = object
Downcasting AnyObject
AnyObject does not implicitly downcast
Downcasting AnyObject
AnyObject does not implicitly downcast
Downcasting AnyObject
AnyObject does not implicitly downcast
Protocols
Objective-C
@protocol UITableViewDataSource<NSObject>
@optional
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
@required
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section;
@end
Protocols
Objective-C
@protocol UITableViewDataSource<NSObject>
@optional
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
@required
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section;
@end
Swift
@objc protocol UITableViewDataSource : NSObjectProtocol {
func tableView(tableView: UITableView, numberOfRowsInSection: Int) -> Int
@optional func numberOfSectionsInTableView(tableView: UITableView) -> Int
}
Protocols
Objective-C
@protocol UITableViewDataSource<NSObject>
@optional
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
@required
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section;
@end
Swift
@objc protocol UITableViewDataSource : NSObjectProtocol {
func tableView(tableView: UITableView, numberOfRowsInSection: Int) -> Int
@optional func numberOfSectionsInTableView(tableView: UITableView) -> Int
}
Protocols
Objective-C
@protocol UITableViewDataSource<NSObject>
@optional
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
@required
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section;
@end
Swift
@objc protocol UITableViewDataSource : NSObjectProtocol {
func tableView(tableView: UITableView, numberOfRowsInSection: Int) -> Int
@optional func numberOfSectionsInTableView(tableView: UITableView) -> Int
}
Protocol Types
Objective-C
Protocol Types
Objective-C
Swift
var dataSource: UITableViewDataSource!
Protocol Types
Objective-C
@property
id <UINavigationControllerDelegate,
UIImagePickerControllerDelegate> delegate;
Swift
var dataSource: UITableViewDataSource!
var delegate: protocol<UINavigationControllerDelegate,
UIImagePickerControllerDelegate>
lastSection = numSections - 1
}
let rowsInLastSection = dataSource.tableView(tableView,
numberOfRowsInSection: lastSection)
}
lastSection = numSections - 1
}
let rowsInLastSection = dataSource.tableView(tableView,
numberOfRowsInSection: lastSection)
}
Advanced Swift
Presidio
Thursday 11:30AM
Characters
Iteration over a string produces characters
let dog = "Dog!"
for c in dog {
// c is inferred as Character
println(c)
}
Characters
Iteration over a string produces characters
let dog = "Dog!"
for c in dog {
// c is inferred as Character
println(c)
}
D
o
g
!
Code Points
UTF-16 is available via a property
for codePoint in dog.utf16 { // codePoint is inferred as UInt16
//
}
Code Points
UTF-16 is available via a property
for codePoint in dog.utf16 { // codePoint is inferred as UInt16
//
}
Swift
var toolbarItems: AnyObject[]!
Upcasting Arrays
An array T[] can be assigned to an AnyObject[]
Downcasting Arrays
Iteration over an AnyObject[] produces AnyObject values
Downcasting Arrays
Iteration over an AnyObject[] produces AnyObject values
for object: AnyObject in viewController.toolbarItems {
let item = object as UIBarButtonItem
//
}
T[]
Native
T[]
length capacity 0 1 2 3 4 5 6
Native
length capacity 0 1 2 3 4 5 6
T[]
Cocoa
NSArray object
Native
length capacity 0 1 2 3 4 5 6
T[]
Cocoa
NSArray object
Native
length capacity 0 1 2 3 4 5 6
T[]
Cocoa
Array methods manage the representation internally
NSArray object
Native
length capacity 0 1 2 3 4 5 6
T[]
Cocoa
NSArray object
Native
length capacity 0 1 2 3 4 5 6
T[]
Cocoa
NSArray object
Native
length capacity 0 1 2 3 4 5 6
T[]
Cocoa
NSArray object
Native
isa
length capacity 0 1 2 3 4 5 6
T[]
Cocoa
NSArray object
Native
T[]
Cocoa
NSArray object
Inherit from an Objective-C class to make your class directly visible in Objective-C
class MyDocument : UIDocument {
var items: String[] = []
}
Overriding Methods
override keyword required when overriding a method
override func handleError(error: NSError!, userInteractionPermitted: Bool) {
// customized behavior
super.handleError(error,
userInteractionPermitted: userInteractionPermitted)
}
Overriding Properties
Override the property itself, not the getter or setter
override var description: String {
}
- (void)handleError:(NSError *)error
userInteractionPermitted:(BOOL)userInteractionPermitted;
- (void)handleError:(NSError *)error
userInteractionPermitted:(BOOL)userInteractionPermitted;
// Swift: var
items: String[] = []
- (void)handleError:(NSError *)error
userInteractionPermitted:(BOOL)userInteractionPermitted;
- (void)handleError:(NSError *)error
userInteractionPermitted:(BOOL)userInteractionPermitted;
- (void)handleError:(NSError *)error
userInteractionPermitted:(BOOL)userInteractionPermitted;
Limitations of Objective-C
Swift has advanced features that arent expressible in Objective-C
Tuples
Generics
Enums and structs
func
Limitations of Objective-C
Swift has advanced features that arent expressible in Objective-C
Tuples
Generics
Enums and structs
@objc
CF Interoperability
CF in Objective-C
void drawGradientRect(CGContextRef context, CGColorRef startColor,
CGColorRef endColor, CGFloat width, CGFloat height) {
CF in Objective-C
void drawGradientRect(CGContextRef context, CGColorRef startColor,
CGColorRef endColor, CGFloat width, CGFloat height) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSArray *colors = @[(__bridge id)startColor, (__bridge id)endColor];
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace,
(CFArrayRef)colors, locations);
CF in Objective-C
Bridge casts
void drawGradientRect(CGContextRef context, CGColorRef startColor,
CGColorRef endColor, CGFloat width, CGFloat height) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSArray *colors = @[(__bridge id)startColor, (__bridge id)endColor];
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace,
(CFArrayRef)colors, locations);
CF in Objective-C
Three kinds of arrays
void drawGradientRect(CGContextRef context, CGColorRef startColor,
CGColorRef endColor, CGFloat width, CGFloat height) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSArray *colors = @[(__bridge id)startColor, (__bridge id)endColor];
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace,
(CFArrayRef)colors, locations);
CF in Objective-C
void drawGradientRect(CGContextRef context, CGColorRef startColor,
CGColorRef endColor, CGFloat width, CGFloat height) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSArray *colors = @[(__bridge id)startColor, (__bridge id)endColor];
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace,
(CFArrayRef)colors, locations);
!
CF in Objective-C
Manual memory management
void drawGradientRect(CGContextRef context, CGColorRef startColor,
CGColorRef endColor, CGFloat width, CGFloat height) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
NSArray *colors = @[(__bridge id)startColor, (__bridge id)endColor];
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace,
(CFArrayRef)colors, locations);
!
CGColorSpaceRelease(colorSpace);
CGGradientRelease(gradient);
CF in Swift
func drawGradientRect(context: CGContext, startColor: CGColor,
endColor: CGColor, width: CGFloat, height: CGFloat) {
Managed CF Objects
func drawGradientRect(context: CGContext, startColor: CGColor,
endColor: CGColor, width: CGFloat, height: CGFloat) {
let colorSpace = CGColorSpaceCreateDeviceRGB()
Managed CF Objects
func drawGradientRect(context: CGContext, startColor: CGColor,
endColor: CGColor, width: CGFloat, height: CGFloat) {
let colorSpace = CGColorSpaceCreateDeviceRGB() // inferred as CGColorSpace
Managed CF Objects
func drawGradientRect(context: CGContext, startColor: CGColor,
endColor: CGColor, width: CGFloat, height: CGFloat) {
let colorSpace = CGColorSpaceCreateDeviceRGB() // inferred as CGColorSpace
C Interoperability
Construction of C Structs
func drawGradientRect(context: CGContext, startColor: CGColor,
endColor: CGColor, width: CGFloat, height: CGFloat) {
let colorSpace = CGColorSpaceCreateDeviceRGB()
let gradient = CGGradientCreateWithColors(colorSpace,
[startColor, endColor],
[0.0, 1.0])
// for +0 returns
// for +1 returns
// for +0 returns
// for +1 returns
Advanced Swift
Presidio
Thursday 11:30AM
// for +0 returns
// for +1 returns
Advanced Swift
Presidio
Thursday 11:30AM
// for +0 returns
// for +1 returns
Advanced Swift
Presidio
Thursday 11:30AM
// for +0 returns
// for +1 returns
Advanced Swift
Presidio
Thursday 11:30AM
Implicit Bridging
Audit CF APIs to ensure that conform to CF memory conventions
CGColorRef CGColorGetRandomColor(void);
Implicit Bridging
Audit CF APIs to ensure that conform to CF memory conventions
CF_IMPLICIT_BRIDGING_ENABLED
CGColorRef CGColorGetRandomColor(void);
CF_IMPLICIT_BRIDGING_DISABLED
Implicit Bridging
Audit CF APIs to ensure that conform to CF memory conventions
CF_IMPLICIT_BRIDGING_ENABLED
CGColorRef CGColorGetRandomColor(void);
CF_IMPLICIT_BRIDGING_DISABLED
Summary
Seamless interoperability between Swift and Objective-C
Let the tools help you understand the relationship
More Information
Dave DeLong
Developer Tools Evangelist
delong@apple.com
Documentation
Using Swift with Cocoa and Objective-C
http://apple.com
Apple Developer Forums
http://devforums.apple.com
Related Sessions
Intermediate
Swift
Advanced
Swift
Presidio
Wednesday 9:00AM
Presidio
Wednesday 2:00PM
Presidio
Thursday 11:30AM
Labs
Swift
Swift
Swift
Swift
Tools Lab A
Thursday 9:00AM
Tools Lab A
Thursday 2:00PM
Tools Lab A
Friday 9:00AM
Tools Lab A
Friday 2:00PM