Skip to content

Instantly share code, notes, and snippets.

View sgr-ksmt's full-sized avatar
👉
👁👃👁

Suguru Kishimoto sgr-ksmt

👉
👁👃👁
View GitHub Profile
@sgr-ksmt
sgr-ksmt / file.swift
Created September 26, 2016 05:55
Safe DispatchQueue.main.sync (Swift3.0)
extension DispatchQueue {
class func mainSyncSafe(execute work: () -> Void) {
if Thread.isMainThread {
work()
} else {
DispatchQueue.main.sync(execute: work)
}
}
class func mainSyncSafe<T>(execute work: () throws -> T) rethrows -> T {
@sgr-ksmt
sgr-ksmt / StoryboardInstantiatable.swift
Last active October 12, 2023 09:11
Create UIViewController from storyboard and pass parameter safely.
public protocol StoryboardInstantiatable {
static var storyboardName: String { get }
static var viewControllerIdentifier: String? { get }
static var bundle: Bundle? { get }
}
public extension StoryboardInstantiatable where Self: UIViewController {
public static var storyboardName: String {
return String(describing: self)
}
{
"freezed":{
"prefix": "freezed",
"body": [
"import 'package:flutter/foundation.dart';",
"import 'package:freezed_annotation/freezed_annotation.dart';",
"",
"part '$1.freezed.dart';",
"part '$1.g.dart';",
"",
@sgr-ksmt
sgr-ksmt / file.swift
Last active May 8, 2023 03:51
UIScrollView: scroll top/bottom/left/right perfectly! http://blog.sgr-ksmt.org/2016/11/11/uiscrollview_scroll_extension/
extension UIScrollView {
public enum ScrollDirection {
case top
case bottom
case left
case right
}
public func scroll(to direction: ScrollDirection, animated: Bool) {
let offset: CGPoint
@sgr-ksmt
sgr-ksmt / ObservableType+compose.swift
Last active May 3, 2023 03:01
compose operator for RxSwift
struct ComposeTransformer<T, R> {
let transformer: (Observable<T>) -> Observable<R>
init(transformer: @escaping (Observable<T>) -> Observable<R>) {
self.transformer = transformer
}
func call(_ observable: Observable<T>) -> Observable<R> {
return transformer(observable)
}
}
@sgr-ksmt
sgr-ksmt / AnyObserver+.swift
Last active September 9, 2022 10:07
MVVM + RxSwift + Property Wrapper
extension AnyObserver {
static func create<E>(_ relay: PublishRelay<E>) -> AnyObserver<E> {
return .init { event in
guard case let .next(value) = event else { return }
relay.accept(value)
}
}
static func create<E>(_ relay: BehaviorRelay<E>) -> AnyObserver<E> {
return .init { event in
@sgr-ksmt
sgr-ksmt / main.dart
Last active September 6, 2022 05:36
SliverList + separated
import 'dart:math' as math;
import 'package:flutter/material.dart';
extension SliverListEx on SliverList {
static SliverList separated({
required int itemCount,
required NullableIndexedWidgetBuilder itemBuilder,
required NullableIndexedWidgetBuilder separatorBuilder,
}) {
return SliverList(
@sgr-ksmt
sgr-ksmt / Contents.swift
Last active May 9, 2022 23:07
JSONDecoder+keypath
//: Playground - noun: a place where people can play
import UIKit
var json: String = """
{
"result": {
"persons": [
{
@sgr-ksmt
sgr-ksmt / firestore.rules
Created December 31, 2019 07:33
Convenience `firestore.rules`'s function.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Create `Path` from array of string.
function documentPath(paths) {
return path([
['databases', database, 'documents'].join('/'),
paths.join('/')
].join('/'));
}
@sgr-ksmt
sgr-ksmt / UIView+NibInstantiatable.swift
Last active October 20, 2021 13:33
Load ViewController from Storyboard or View from Xib (These are same name.) Require : Swift 2.0
protocol NibInstantiatable {
static var NibName: String { get }
}
extension NibInstantiatable {
static var NibName: String { return String(Self) }
static func instantiate() -> Self {
return instantiateWithName(NibName)