Skip to content

Instantly share code, notes, and snippets.

View ryotapoi's full-sized avatar

Ryota Kurosaki ryotapoi

View GitHub Profile
@ryotapoi
ryotapoi / MySubject_incompletion.swift
Last active July 12, 2020 17:01
Combine.Subjectの簡易で不完全な実装
import Combine
class MySubject<Output, Failure : Error> : Combine.Subject {
var value: Output {
didSet {
// 値が変更されたらsubscriptionに通知します。
// Subject -> Subscription -> Subscriber の順に値が送られます。
subscriptions.forEach { $0.receive(value) }
}
}
@ryotapoi
ryotapoi / playground.swift
Last active June 9, 2020 17:15
CurrentValueSubjectの詳細な動作を確認する
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
@ryotapoi
ryotapoi / faceid.md
Last active June 8, 2020 05:16
Face ID(Touch IDを含む生体認証)

Face ID(Touch ID)

デバイスの正当な所有者であることを

  • 生体認証のみで認証する
  • 生体認証またはiOSパスワードで認証する
  • 生体認証またはアプリ独自の認証方式で認証する

を選べる。

@ryotapoi
ryotapoi / UserDefaultPropertyWrapper_Playground.swift
Last active May 22, 2021 12:19
UserDefaultPropertyWrapper for Playground
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) {
@ryotapoi
ryotapoi / URLComponentsCompatible_Playground.swift
Created April 10, 2020 16:30
URL Schemeをカッコよくstructにマッピングし、エラー詳細をthrowする
import Foundation
// URLQueryKey
public class URLQueryKeys {
public init() {}
}
public class URLQueryKey : URLQueryKeys, ExpressibleByStringLiteral {
var name: String
@ryotapoi
ryotapoi / URLQueryItemAccess.swift
Last active March 17, 2020 09:09
URLQueryItemをカッコよく使いたい
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
}
@ryotapoi
ryotapoi / Publisher.swift
Created May 27, 2019 03:08
Delegateを複数のオブジェクトに配信する
public class Publisher<Subscriber> {
private class Disposer {
private let disposing: () -> Void
fileprivate init(disposing: @escaping () -> Void) {
self.disposing = disposing
}
deinit {
button.imageView?.contentMode = .scaleAspectFit
button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill

コードを書くと実行時にAspect Fitになる。 Interface Builder上では正しく表示されない。

IBDesignableで指定できるボタンを作ると便利かも?