Skip to content

Instantly share code, notes, and snippets.

@kviksilver
Created March 24, 2017 16:57
Show Gist options
  • Save kviksilver/f8811db7fd34a009bd4e51da7d77e714 to your computer and use it in GitHub Desktop.
Save kviksilver/f8811db7fd34a009bd4e51da7d77e714 to your computer and use it in GitHub Desktop.
//: 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