Merge pull request #20 from gershwin88/master

Fixing errors and warning when using Swift 2
This commit is contained in:
Matt Coneybeare
2015-09-18 11:23:32 -04:00
+50 -55
View File
@@ -602,7 +602,7 @@ public class StandardUserDefaults: ArmchairDefaultsObject {
@objc public func synchronize() -> Bool { return defaults.synchronize() } @objc public func synchronize() -> Bool { return defaults.synchronize() }
} }
public enum ArmchairKey: String, Printable { public enum ArmchairKey: String, CustomStringConvertible {
case FirstUseDate = "First Use Date" case FirstUseDate = "First Use Date"
case UseCount = "Use Count" case UseCount = "Use Count"
case SignificantEventCount = "Significant Event Count" case SignificantEventCount = "Significant Event Count"
@@ -626,7 +626,7 @@ public enum ArmchairKey: String, Printable {
} }
} }
public class ArmchairTrackingInfo: Printable { public class ArmchairTrackingInfo: CustomStringConvertible {
public let info: Dictionary<ArmchairKey, AnyObject> public let info: Dictionary<ArmchairKey, AnyObject>
init(info: Dictionary<ArmchairKey, AnyObject>) { init(info: Dictionary<ArmchairKey, AnyObject>) {
@@ -704,7 +704,7 @@ public class Manager : ArmchairManager {
template = bundle.localizedStringForKey(template, value:"", table: "ArmchairLocalizable") template = bundle.localizedStringForKey(template, value:"", table: "ArmchairLocalizable")
} }
return template.stringByReplacingOccurrencesOfString("%@", withString: "\(self.appName)", options: nil, range: nil) return template.stringByReplacingOccurrencesOfString("%@", withString: "\(self.appName)", options: NSStringCompareOptions(rawValue: 0), range: nil)
} }
private lazy var reviewMessage: String = self.defaultReviewMessage() private lazy var reviewMessage: String = self.defaultReviewMessage()
@@ -715,7 +715,7 @@ public class Manager : ArmchairManager {
template = bundle.localizedStringForKey(template, value:"", table: "ArmchairLocalizable") template = bundle.localizedStringForKey(template, value:"", table: "ArmchairLocalizable")
} }
return template.stringByReplacingOccurrencesOfString("%@", withString: "\(self.appName)", options: nil, range: nil) return template.stringByReplacingOccurrencesOfString("%@", withString: "\(self.appName)", options: NSStringCompareOptions(rawValue: 0), range: nil)
} }
private lazy var cancelButtonTitle: String = self.defaultCancelButtonTitle() private lazy var cancelButtonTitle: String = self.defaultCancelButtonTitle()
@@ -737,7 +737,7 @@ public class Manager : ArmchairManager {
template = bundle.localizedStringForKey(template, value:"", table: "ArmchairLocalizable") template = bundle.localizedStringForKey(template, value:"", table: "ArmchairLocalizable")
} }
return template.stringByReplacingOccurrencesOfString("%@", withString: "\(self.appName)", options: nil, range: nil) return template.stringByReplacingOccurrencesOfString("%@", withString: "\(self.appName)", options: NSStringCompareOptions(rawValue: 0), range: nil)
} }
private lazy var remindButtonTitle: String? = self.defaultRemindButtonTitle() private lazy var remindButtonTitle: String? = self.defaultRemindButtonTitle()
@@ -916,7 +916,7 @@ public class Manager : ArmchairManager {
} }
private func _incrementCountForKeyType(incrementKeyType: ArmchairKey) { private func _incrementCountForKeyType(incrementKeyType: ArmchairKey) {
var incrementKey = keyForArmchairKeyType(incrementKeyType) let incrementKey = keyForArmchairKeyType(incrementKeyType)
let bundleVersionKey = kCFBundleVersionKey as String let bundleVersionKey = kCFBundleVersionKey as String
// App's version. Not settable as the other ivars because that would be crazy. // App's version. Not settable as the other ivars because that would be crazy.
@@ -927,11 +927,10 @@ public class Manager : ArmchairManager {
} }
// Get the version number that we've been tracking thus far // Get the version number that we've been tracking thus far
var currentVersionKey = keyForArmchairKeyType(ArmchairKey.CurrentVersion) let currentVersionKey = keyForArmchairKeyType(ArmchairKey.CurrentVersion)
var trackingVersion: String? = userDefaultsObject?.stringForKey(currentVersionKey) var trackingVersion: String? = userDefaultsObject?.stringForKey(currentVersionKey)
// New install, or changed keys // New install, or changed keys
if let version = trackingVersion { if trackingVersion == nil {
} else {
trackingVersion = currentVersion trackingVersion = currentVersion
userDefaultsObject?.setObject(currentVersion, forKey: currentVersionKey) userDefaultsObject?.setObject(currentVersion, forKey: currentVersionKey)
} }
@@ -940,7 +939,7 @@ public class Manager : ArmchairManager {
if trackingVersion == currentVersion { if trackingVersion == currentVersion {
// Check if the first use date has been set. if not, set it. // Check if the first use date has been set. if not, set it.
var firstUseDateKey = keyForArmchairKeyType(ArmchairKey.FirstUseDate) let firstUseDateKey = keyForArmchairKeyType(ArmchairKey.FirstUseDate)
var timeInterval: Double? = userDefaultsObject?.doubleForKey(firstUseDateKey) var timeInterval: Double? = userDefaultsObject?.doubleForKey(firstUseDateKey)
if 0 == timeInterval { if 0 == timeInterval {
timeInterval = NSDate().timeIntervalSince1970 timeInterval = NSDate().timeIntervalSince1970
@@ -1030,11 +1029,11 @@ public class Manager : ArmchairManager {
} }
// check if the app has been used long enough // check if the app has been used long enough
var timeIntervalOfFirstLaunch = userDefaultsObject?.doubleForKey(keyForArmchairKeyType(ArmchairKey.FirstUseDate)) let timeIntervalOfFirstLaunch = userDefaultsObject?.doubleForKey(keyForArmchairKeyType(ArmchairKey.FirstUseDate))
if let timeInterval = timeIntervalOfFirstLaunch { if let timeInterval = timeIntervalOfFirstLaunch {
var dateOfFirstLaunch = NSDate(timeIntervalSince1970: timeInterval) let dateOfFirstLaunch = NSDate(timeIntervalSince1970: timeInterval)
var timeSinceFirstLaunch = NSDate().timeIntervalSinceDate(dateOfFirstLaunch) let timeSinceFirstLaunch = NSDate().timeIntervalSinceDate(dateOfFirstLaunch)
var timeUntilRate: NSTimeInterval = 60 * 60 * 24 * Double(daysUntilPrompt) let timeUntilRate: NSTimeInterval = 60 * 60 * 24 * Double(daysUntilPrompt)
if timeSinceFirstLaunch < timeUntilRate { if timeSinceFirstLaunch < timeUntilRate {
return false return false
} }
@@ -1043,7 +1042,7 @@ public class Manager : ArmchairManager {
} }
// check if the app has been used enough times // check if the app has been used enough times
var useCount = userDefaultsObject?.integerForKey(keyForArmchairKeyType(ArmchairKey.UseCount)) let useCount = userDefaultsObject?.integerForKey(keyForArmchairKeyType(ArmchairKey.UseCount))
if let count = useCount { if let count = useCount {
if UInt(count) <= usesUntilPrompt { if UInt(count) <= usesUntilPrompt {
return false return false
@@ -1053,7 +1052,7 @@ public class Manager : ArmchairManager {
} }
// check if the user has done enough significant events // check if the user has done enough significant events
var significantEventCount = userDefaultsObject?.integerForKey(keyForArmchairKeyType(ArmchairKey.SignificantEventCount)) let significantEventCount = userDefaultsObject?.integerForKey(keyForArmchairKeyType(ArmchairKey.SignificantEventCount))
if let count = significantEventCount { if let count = significantEventCount {
if UInt(count) < significantEventsUntilPrompt { if UInt(count) < significantEventsUntilPrompt {
return false return false
@@ -1073,11 +1072,11 @@ public class Manager : ArmchairManager {
} }
// If the user wanted to be reminded later, has enough time passed? // If the user wanted to be reminded later, has enough time passed?
var timeIntervalOfReminder = userDefaultsObject?.doubleForKey(keyForArmchairKeyType(ArmchairKey.ReminderRequestDate)) let timeIntervalOfReminder = userDefaultsObject?.doubleForKey(keyForArmchairKeyType(ArmchairKey.ReminderRequestDate))
if let timeInterval = timeIntervalOfReminder { if let timeInterval = timeIntervalOfReminder {
var reminderRequestDate = NSDate(timeIntervalSince1970: timeInterval) let reminderRequestDate = NSDate(timeIntervalSince1970: timeInterval)
var timeSinceReminderRequest = NSDate().timeIntervalSinceDate(reminderRequestDate) let timeSinceReminderRequest = NSDate().timeIntervalSinceDate(reminderRequestDate)
var timeUntilReminder: NSTimeInterval = 60 * 60 * 24 * Double(daysBeforeReminding) let timeUntilReminder: NSTimeInterval = 60 * 60 * 24 * Double(daysBeforeReminding)
if timeSinceReminderRequest < timeUntilReminder { if timeSinceReminderRequest < timeUntilReminder {
return false return false
} }
@@ -1086,7 +1085,7 @@ public class Manager : ArmchairManager {
} }
// if we have a global set to not show if the end-user has already rated once, and the developer has not opted out of displaying on minor updates // if we have a global set to not show if the end-user has already rated once, and the developer has not opted out of displaying on minor updates
var ratedAnyVersion = userDefaultsObject?.boolForKey(keyForArmchairKeyType(ArmchairKey.RatedAnyVersion)) let ratedAnyVersion = userDefaultsObject?.boolForKey(keyForArmchairKeyType(ArmchairKey.RatedAnyVersion))
if let ratedAlready = ratedAnyVersion { if let ratedAlready = ratedAnyVersion {
if (!shouldPromptIfRated && ratedAlready) { if (!shouldPromptIfRated && ratedAlready) {
return false return false
@@ -1113,18 +1112,14 @@ public class Manager : ArmchairManager {
} }
private func showsRemindButton() -> Bool { private func showsRemindButton() -> Bool {
if let title = remindButtonTitle { return (remindButtonTitle != nil)
return true
} else {
return false
}
} }
private func showRatingAlert() { private func showRatingAlert() {
#if os(iOS) #if os(iOS)
if operatingSystemVersion >= 8 && usesAlertController { if operatingSystemVersion >= 8 && usesAlertController {
/* iOS 8 uses new UIAlertController API*/ /* iOS 8 uses new UIAlertController API*/
var alertView : UIAlertController = UIAlertController(title: reviewTitle, message: reviewMessage, preferredStyle: UIAlertControllerStyle.Alert) let alertView : UIAlertController = UIAlertController(title: reviewTitle, message: reviewMessage, preferredStyle: UIAlertControllerStyle.Alert)
alertView.addAction(UIAlertAction(title: cancelButtonTitle, style:UIAlertActionStyle.Cancel, handler: { alertView.addAction(UIAlertAction(title: cancelButtonTitle, style:UIAlertActionStyle.Cancel, handler: {
(alert: UIAlertAction!) in (alert: UIAlertAction!) in
self.dontRate() self.dontRate()
@@ -1144,7 +1139,7 @@ public class Manager : ArmchairManager {
if let presentingController = UIApplication.sharedApplication().keyWindow?.rootViewController { if let presentingController = UIApplication.sharedApplication().keyWindow?.rootViewController {
if let topController = topMostViewController(presentingController) { if let topController = topMostViewController(presentingController) {
topController.presentViewController(alertView, animated: usesAnimation) { topController.presentViewController(alertView, animated: usesAnimation) {
println("presentViewController() completed") print("presentViewController() completed")
} }
} }
} }
@@ -1171,7 +1166,7 @@ public class Manager : ArmchairManager {
#elseif os(OSX) #elseif os(OSX)
var alert: NSAlert = NSAlert() let alert: NSAlert = NSAlert()
alert.messageText = reviewTitle alert.messageText = reviewTitle
alert.informativeText = reviewMessage alert.informativeText = reviewMessage
alert.addButtonWithTitle(rateButtonTitle) alert.addButtonWithTitle(rateButtonTitle)
@@ -1187,7 +1182,7 @@ public class Manager : ArmchairManager {
self.handleNSAlertReturnCode(response) self.handleNSAlertReturnCode(response)
} }
} else { } else {
var returnCode = alert.runModal() let returnCode = alert.runModal()
handleNSAlertReturnCode(returnCode) handleNSAlertReturnCode(returnCode)
} }
@@ -1302,7 +1297,7 @@ public class Manager : ArmchairManager {
let storeViewController = SKStoreProductViewController() let storeViewController = SKStoreProductViewController()
var productParameters: [NSObject:AnyObject]! = [SKStoreProductParameterITunesItemIdentifier : appID] var productParameters: [String:AnyObject]! = [SKStoreProductParameterITunesItemIdentifier : appID]
if (operatingSystemVersion >= 8) { if (operatingSystemVersion >= 8) {
productParameters[SKStoreProductParameterAffiliateToken] = affiliateCode productParameters[SKStoreProductParameterAffiliateToken] = affiliateCode
@@ -1343,7 +1338,7 @@ public class Manager : ArmchairManager {
} }
#elseif os(OSX) #elseif os(OSX)
if let url = NSURL(string: reviewURLString()) { if let url = NSURL(string: reviewURLString()) {
var opened = NSWorkspace.sharedWorkspace().openURL(url) let opened = NSWorkspace.sharedWorkspace().openURL(url)
if !opened { if !opened {
debugLog("Failed to open \(url)") debugLog("Failed to open \(url)")
} }
@@ -1353,7 +1348,7 @@ public class Manager : ArmchairManager {
} }
private func reviewURLString() -> String { private func reviewURLString() -> String {
var template = reviewURLTemplate let template = reviewURLTemplate
var reviewURL = template.stringByReplacingOccurrencesOfString("APP_ID", withString: "\(appID)") var reviewURL = template.stringByReplacingOccurrencesOfString("APP_ID", withString: "\(appID)")
reviewURL = reviewURL.stringByReplacingOccurrencesOfString("AFFILIATE_CODE", withString: "\(affiliateCode)") reviewURL = reviewURL.stringByReplacingOccurrencesOfString("AFFILIATE_CODE", withString: "\(affiliateCode)")
reviewURL = reviewURL.stringByReplacingOccurrencesOfString("AFFILIATE_CAMPAIGN_CODE", withString: "\(affiliateCampaignCode)") reviewURL = reviewURL.stringByReplacingOccurrencesOfString("AFFILIATE_CAMPAIGN_CODE", withString: "\(affiliateCampaignCode)")
@@ -1367,7 +1362,7 @@ public class Manager : ArmchairManager {
var trackingInfo: Dictionary<ArmchairKey, AnyObject> = [:] var trackingInfo: Dictionary<ArmchairKey, AnyObject> = [:]
for keyType in ArmchairKey.allValues { for keyType in ArmchairKey.allValues {
var obj: AnyObject? = userDefaultsObject?.objectForKey(keyForArmchairKeyType(keyType)) let obj: AnyObject? = userDefaultsObject?.objectForKey(keyForArmchairKeyType(keyType))
if let val = obj as? NSObject { if let val = obj as? NSObject {
trackingInfo[keyType] = val trackingInfo[keyType] = val
} else { } else {
@@ -1466,7 +1461,7 @@ public class Manager : ArmchairManager {
private func migrateAppiraterKeysIfNecessary() { private func migrateAppiraterKeysIfNecessary() {
let appiraterAlreadyCompletedKey: NSString = keyForArmchairKeyType(.AppiraterMigrationCompleted) let appiraterAlreadyCompletedKey: NSString = keyForArmchairKeyType(.AppiraterMigrationCompleted)
var appiraterMigrationAlreadyCompleted = userDefaultsObject?.boolForKey(appiraterAlreadyCompletedKey as String) let appiraterMigrationAlreadyCompleted = userDefaultsObject?.boolForKey(appiraterAlreadyCompletedKey as String)
if let completed = appiraterMigrationAlreadyCompleted { if let completed = appiraterMigrationAlreadyCompleted {
if completed { if completed {
@@ -1474,7 +1469,7 @@ public class Manager : ArmchairManager {
} }
} }
var oldKeys: [String] = [AppiraterKey.FirstUseDate, let oldKeys: [String] = [AppiraterKey.FirstUseDate,
AppiraterKey.UseCount, AppiraterKey.UseCount,
AppiraterKey.SignificantEventCount, AppiraterKey.SignificantEventCount,
AppiraterKey.CurrentVersion, AppiraterKey.CurrentVersion,
@@ -1483,7 +1478,7 @@ public class Manager : ArmchairManager {
AppiraterKey.DeclinedToRate, AppiraterKey.DeclinedToRate,
AppiraterKey.ReminderRequestDate] AppiraterKey.ReminderRequestDate]
for oldKey in oldKeys { for oldKey in oldKeys {
var oldValue: NSObject? = userDefaultsObject?.objectForKey(oldKey) as? NSObject let oldValue: NSObject? = userDefaultsObject?.objectForKey(oldKey) as? NSObject
if let val = oldValue { if let val = oldValue {
let newKey = armchairKeyForAppiraterKey(oldKey) let newKey = armchairKeyForAppiraterKey(oldKey)
userDefaultsObject?.setObject(val, forKey: newKey) userDefaultsObject?.setObject(val, forKey: newKey)
@@ -1498,7 +1493,7 @@ public class Manager : ArmchairManager {
// This only supports the default UAAppReviewManager keys. If you customized them, you will have to manually migrate your values over. // This only supports the default UAAppReviewManager keys. If you customized them, you will have to manually migrate your values over.
private func migrateUAAppReviewManagerKeysIfNecessary() { private func migrateUAAppReviewManagerKeysIfNecessary() {
let appReviewManagerAlreadyCompletedKey: NSString = keyForArmchairKeyType(.UAAppReviewManagerMigrationCompleted) let appReviewManagerAlreadyCompletedKey: NSString = keyForArmchairKeyType(.UAAppReviewManagerMigrationCompleted)
var appReviewManagerMigrationAlreadyCompleted = userDefaultsObject?.boolForKey(appReviewManagerAlreadyCompletedKey as String) let appReviewManagerMigrationAlreadyCompleted = userDefaultsObject?.boolForKey(appReviewManagerAlreadyCompletedKey as String)
if let completed = appReviewManagerMigrationAlreadyCompleted { if let completed = appReviewManagerMigrationAlreadyCompleted {
if completed { if completed {
@@ -1507,7 +1502,7 @@ public class Manager : ArmchairManager {
} }
// By default, UAAppReviewManager keys are in the format <appID>_UAAppReviewManagerKey<keyType> // By default, UAAppReviewManager keys are in the format <appID>_UAAppReviewManagerKey<keyType>
var oldKeys: [String:ArmchairKey] = ["\(appID)_UAAppReviewManagerKeyFirstUseDate" : ArmchairKey.FirstUseDate, let oldKeys: [String:ArmchairKey] = ["\(appID)_UAAppReviewManagerKeyFirstUseDate" : ArmchairKey.FirstUseDate,
"\(appID)_UAAppReviewManagerKeyUseCount" : ArmchairKey.UseCount, "\(appID)_UAAppReviewManagerKeyUseCount" : ArmchairKey.UseCount,
"\(appID)_UAAppReviewManagerKeySignificantEventCount" : ArmchairKey.SignificantEventCount, "\(appID)_UAAppReviewManagerKeySignificantEventCount" : ArmchairKey.SignificantEventCount,
"\(appID)_UAAppReviewManagerKeyCurrentVersion" : ArmchairKey.CurrentVersion, "\(appID)_UAAppReviewManagerKeyCurrentVersion" : ArmchairKey.CurrentVersion,
@@ -1519,7 +1514,7 @@ public class Manager : ArmchairManager {
"\(appID)_UAAppReviewManagerKeyPreviousVersionDeclinedToRate" : ArmchairKey.PreviousVersionDeclinedToRate, "\(appID)_UAAppReviewManagerKeyPreviousVersionDeclinedToRate" : ArmchairKey.PreviousVersionDeclinedToRate,
"\(appID)_UAAppReviewManagerKeyRatedAnyVersion" : ArmchairKey.RatedAnyVersion] "\(appID)_UAAppReviewManagerKeyRatedAnyVersion" : ArmchairKey.RatedAnyVersion]
for (oldKey, newKeyType) in oldKeys { for (oldKey, newKeyType) in oldKeys {
var oldValue: NSObject? = userDefaultsObject?.objectForKey(oldKey) as? NSObject let oldValue: NSObject? = userDefaultsObject?.objectForKey(oldKey) as? NSObject
if let val = oldValue { if let val = oldValue {
userDefaultsObject?.setObject(val, forKey: keyForArmchairKeyType(newKeyType)) userDefaultsObject?.setObject(val, forKey: keyForArmchairKeyType(newKeyType))
userDefaultsObject?.removeObjectForKey(oldKey) userDefaultsObject?.removeObjectForKey(oldKey)
@@ -1543,17 +1538,19 @@ public class Manager : ArmchairManager {
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET) zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) { guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue() SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
} }) else {
var flags : SCNetworkReachabilityFlags = 0
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false return false
} }
let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0 var flags : SCNetworkReachabilityFlags = []
let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0 if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) {
return false
}
let isReachable = flags.contains(.Reachable)
let needsConnection = flags.contains(.ConnectionRequired)
return (isReachable && !needsConnection) return (isReachable && !needsConnection)
} }
@@ -1581,11 +1578,10 @@ public class Manager : ArmchairManager {
private func topMostViewController(controller: UIViewController?) -> UIViewController? { private func topMostViewController(controller: UIViewController?) -> UIViewController? {
var isPresenting: Bool = false var isPresenting: Bool = false
var topController: UIViewController? = controller var topController: UIViewController? = controller
do { repeat {
// this path is called only on iOS 6+, so -presentedViewController is fine here. // this path is called only on iOS 6+, so -presentedViewController is fine here.
if let controller = topController { if let controller = topController {
var presented: UIViewController? = controller.presentedViewController if let presented = controller.presentedViewController {
if let presentedController = presented {
isPresenting = true isPresenting = true
topController = presented topController = presented
} else { } else {
@@ -1601,7 +1597,7 @@ public class Manager : ArmchairManager {
if var window = UIApplication.sharedApplication().keyWindow { if var window = UIApplication.sharedApplication().keyWindow {
if window.windowLevel != UIWindowLevelNormal { if window.windowLevel != UIWindowLevelNormal {
var windows: NSArray = UIApplication.sharedApplication().windows let windows: NSArray = UIApplication.sharedApplication().windows
for candidateWindow in windows { for candidateWindow in windows {
if let candidateWindow = candidateWindow as? UIWindow { if let candidateWindow = candidateWindow as? UIWindow {
if candidateWindow.windowLevel == UIWindowLevelNormal { if candidateWindow.windowLevel == UIWindowLevelNormal {
@@ -1613,8 +1609,7 @@ public class Manager : ArmchairManager {
} }
for subView in window.subviews { for subView in window.subviews {
var nextResponder: UIResponder? = subView.nextResponder() if let responder = subView.nextResponder() {
if let responder = nextResponder {
if responder.isKindOfClass(UIViewController) { if responder.isKindOfClass(UIViewController) {
return topMostViewController(responder as? UIViewController) return topMostViewController(responder as? UIViewController)
} }
@@ -1723,7 +1718,7 @@ public class Manager : ArmchairManager {
private func debugLog(log: String) { private func debugLog(log: String) {
if debugEnabled { if debugEnabled {
dispatch_sync(lockQueue, { dispatch_sync(lockQueue, {
println("[Armchair] \(log)") print("[Armchair] \(log)")
}) })
} }
} }