Skip to content

Instantly share code, notes, and snippets.

View Marcocanc's full-sized avatar
🚀

Marco Cancellieri Marcocanc

🚀
View GitHub Profile
@Marcocanc
Marcocanc / Kingfisher+Reactive.swift
Created March 6, 2018 13:05
Kingfisher Reactive Extension
import ReactiveSwift
import ReactiveCocoa
import Kingfisher
extension Kingfisher: ReactiveExtensionsProvider { }
extension Reactive where Base == Kingfisher<UIImageView> {
var image: BindingTarget<URL?> {
return makeBindingTarget {
$0.setImage(with: $1)
}
@Marcocanc
Marcocanc / LAContext+BiometryType.swift
Last active March 16, 2018 13:35
BiometryType for iOS 8+
import LocalAuthentication
extension LAContext {
/// BiometryType that works on iOS versions older than iOS 11.
var compatBiometryType: BiometryType {
var authError: NSError?
guard canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError), authError == nil else { return .none }
// On iOS 11 we can get the biometry type directly.
if #available(iOS 11.0, *) {
switch biometryType {
extension SignalProducer {
func replayingShare() -> SignalProducer<Value, Error> {
let subCount = Atomic<UInt64>(0)
var upstreamLifetime = Lifetime.empty
var token = Lifetime.Token()
var replayedProducer: SignalProducer<Value, Error> = .empty
return SignalProducer { observer, lifetime in
if upstreamLifetime.hasEnded {
upstreamLifetime = Lifetime(token)
@Marcocanc
Marcocanc / GermanTin.swift
Created May 10, 2019 13:43
German TIN validation
func isGermanTin(tin: String) -> Bool {
let endIndex = tin.index(tin.startIndex, offsetBy: 10)
let tinNumbers = tin[..<endIndex].compactMap { Int(String($0)) }
// First number can't be 0
guard tinNumbers.first != 0 else { return false }
// There should be exactly 8 or 9 unique numbers and exactly one that has 2 occurrances
let occurances = tinNumbers.reduce(into: [:]) { $0[$1, default: 0] += 1 }
guard 8...9 ~= occurances.keys.count else { return false }
let occurranceCount = occurances.keys.count == 9 ? 2 : 3
guard occurances.values.contains(where: { $0 == occurranceCount }) else { return false }