デバイスの正当な所有者であることを
- 生体認証のみで認証する
- 生体認証またはiOSパスワードで認証する
- 生体認証またはアプリ独自の認証方式で認証する
を選べる。
import Combine | |
class MySubject<Output, Failure : Error> : Combine.Subject { | |
var value: Output { | |
didSet { | |
// 値が変更されたらsubscriptionに通知します。 | |
// Subject -> Subscription -> Subscriber の順に値が送られます。 | |
subscriptions.forEach { $0.receive(value) } | |
} | |
} |
import Combine | |
do { | |
let subject: CurrentValueSubject<Int, Error> = .init(1) | |
subject.send(completion: .finished) | |
// completionしているとsinkで即competionが呼ばれる | |
let cancelable = subject.sink(receiveCompletion: { (completion) in | |
completion | |
return |
import UIKit | |
// UserDefaults | |
extension UserDefaults { | |
public func value<Value : UserDefaultCompatible>(type: Value.Type = Value.self, forKey key: String, default defaultValue: Value) -> Value { | |
guard let object = object(forKey: key) else { return defaultValue } | |
return Value(userDefaultObject: object) ?? defaultValue | |
} | |
public func setValue<Value : UserDefaultCompatible>(_ value: Value, forKey key: String) { |
import Foundation | |
// URLQueryKey | |
public class URLQueryKeys { | |
public init() {} | |
} | |
public class URLQueryKey : URLQueryKeys, ExpressibleByStringLiteral { | |
var name: String |
import Foundation | |
// MARK: - URLQueryItem Key | |
class URLQueryItemKeys { | |
init() {} | |
} | |
class URLQueryItemKey<Value : URLQueryItemValueCompatible> : URLQueryItemKeys { | |
let name: String |
extension Array where Element == URLQueryItem { | |
func stringValue(for name: String) -> String? { | |
let item = first { $0.name == name } | |
return item?.value | |
} | |
func urlValue(for name: String) -> URL? { | |
guard let string = stringValue(for: name) else { return nil } | |
return URL(string: string) |
public struct CircularBuffer<Element> { | |
var beginIndex: Int | |
var endIndex: Int? | |
var buffer: [Element?] | |
var capacity: Int { | |
return buffer.count | |
} |
public class Publisher<Subscriber> { | |
private class Disposer { | |
private let disposing: () -> Void | |
fileprivate init(disposing: @escaping () -> Void) { | |
self.disposing = disposing | |
} | |
deinit { |