Created
March 24, 2017 16:57
-
-
Save kviksilver/f8811db7fd34a009bd4e51da7d77e714 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
//: Playground - noun: a place where people can play | |
import UIKit | |
protocol BoolUserDefaults { | |
func bool(forKey defaultName: String) -> Bool | |
func set(_ value: Any?, forKey defaultName: String) | |
} | |
extension UserDefaults: BoolUserDefaults {} | |
final class FirstLaunch { | |
let wasLaunchedBefore: Bool | |
var isFirstLaunch: Bool { | |
return !wasLaunchedBefore | |
} | |
init(userDefaults: BoolUserDefaults = UserDefaults.standard) { | |
let key = "com.any-suggestion.FirstLaunch.WasLaunchedBefore" | |
let wasLaunchedBefore = userDefaults.bool(forKey: key) | |
self.wasLaunchedBefore = wasLaunchedBefore | |
if !wasLaunchedBefore { | |
userDefaults.set(true, forKey: key) | |
} | |
} | |
} | |
FirstLaunch().isFirstLaunch | |
FirstLaunch().isFirstLaunch | |
//TESTS | |
class MockUserDefaults: BoolUserDefaults { | |
var defaults = [String: Bool]() | |
var mockedValue: Bool? | |
func bool(forKey defaultName: String) -> Bool { | |
return mockedValue ?? defaults[defaultName] ?? false | |
} | |
func set(_ value: Any?, forKey defaultName: String) { | |
guard let value = value else { | |
defaults[defaultName] = nil | |
return | |
} | |
guard let boolValue = value as? Bool else { | |
fatalError("should it be bool?") | |
} | |
defaults[defaultName] = boolValue | |
} | |
} | |
let mockedDefaults = MockUserDefaults() | |
assert(FirstLaunch(userDefaults: mockedDefaults).isFirstLaunch) | |
assert(!FirstLaunch(userDefaults: mockedDefaults).isFirstLaunch) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment