- app store views
- installs
- sessions
- active devices
- retention
- stickiness
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// PFTrendsViewModel.m | |
// SUM | |
// | |
// Created by Ben Guo on 11/26/14. | |
// Copyright (c) 2014 Project Florida. All rights reserved. | |
// | |
#import "PFTestUtilities.h" | |
#import "PFTrendsViewModel.h" |
WWDC 2014 Brain Lanier
- Cleaner alternative to using sentinels (
NULL
,NSNotFound
, etc.) to represent invalid values - optionals are initialized to nil by default
var optionalNumber: Int?
nil
is a sentinel value that works with any type- value is wrapped in optional by setter
optionalNumber = 6
- A value of class type in Swift is never nil
var fileModificationDate: NSDate!
- Objective-C does not have a notion of a "never-nil" pointer
!
is an implicitly unwrapped optional- can be tested explicitly for nil
- can directly access properties/methods of the underlying value
- can be implicitly converted to its underlying value
-
Swift is modern, type-safe, expressive, performant
-
but Objective-C remains a first-class citizen
-
Same design patterns, Cocoa APIs
-
"We do not want you to rewrite or stop improving your existing code!"
-
Should you use
unowned
orweak
for delegates? -
To expose Objective-C to Swift, use a bridging header
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
infix operator | {} | |
func | (lhs: String, rhs: String) -> String { | |
return NSLocalizedString(lhs, comment: rhs) | |
} | |
postfix operator | {} | |
postfix func | (s: String) -> String { | |
return NSLocalizedString(s, comment: "") | |
} |
Assuming that you don't care which NSManagedObjectContext is used, and you just want to make some changes and save them in the background, use the following method. 90% of the time, this is what you'll want.
NSManagedObjectSubclass *myObject = [NSManagedObjectSubclass MR_findFirst];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<!DOCTYPE dictionary SYSTEM "file://localhost/System/Library/DTDs/sdef.dtd"> | |
<dictionary title="Dictionary"> | |
<suite name="Spotify Suite" code="spfy" description="Spotify specific classes."> | |
<enumeration name="ePlS" code="ePlS"> | |
<enumerator name="stopped" code="kPSS"> | |
<cocoa integer-value="0"/> | |
</enumerator> | |
<enumerator name="playing" code="kPSP"> | |
<cocoa integer-value="1"/> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Cocoa | |
protocol Pet { | |
var name : String { get } | |
func renamed(newName: String) -> Self | |
} | |
struct Fish : Pet { | |
let name : String | |
func renamed(newName: String) -> Fish { |
OlderNewer