Skip to content

Instantly share code, notes, and snippets.

View ilyapuchka's full-sized avatar

Ilya Puchka ilyapuchka

View GitHub Profile
@ilyapuchka
ilyapuchka / gist:6ef4a708fb438c35e66b165130b1f20e
Last active October 14, 2017 08:35
Generic typealias in protocol
/*
Xcode 8 beta 6
Apple Swift version 3.0 (swiftlang-800.0.43.6 clang-800.0.38)
Target: x86_64-apple-macosx10.9
*/
struct Generic<A, B> {}
//if typealias is defined inside the concrete type it works:
class SomeClass {
@ilyapuchka
ilyapuchka / NSCodingBox.swift
Last active September 23, 2016 20:52
Swift & NSCoding
public final class Box<T> {
public let value: T
public init(value: T) {
self.value = value
}
}
public final class NSCodingBox<T: Coding>: NSObject, NSCoding {
public let value: T
@ilyapuchka
ilyapuchka / StyleProxy.swift
Last active May 19, 2020 20:14
Adaptive Font styles
public protocol Stylish: class {
func updateStyle()
}
public class StyleProxy<S: Stylish>: NSObject {
fileprivate override init() { }
}
private class StyleProxyView<S: Stylish>: UIView {
@ilyapuchka
ilyapuchka / UIVisualEffect.swift
Last active January 21, 2020 21:57
(Ab)using UIVisualEffectView effect settings
extension UIVisualEffectView {
private var filterLayer: CALayer? {
return layer.sublayers?.first
}
private var blurFilter: NSObject? {
return filterLayer?
.filters?.flatMap({ $0 as? NSObject })
.first(where: { $0.value(forKey: "name") as? String == "gaussianBlur" })
import XCTest
import Ambassador
import Embassy
class EmbassyRedirectUITests: XCTestCase {
var app: XCUIApplication!
var router: Router!
private var eventLoop: EventLoop!
@ilyapuchka
ilyapuchka / StickyLayout.swift
Last active February 25, 2024 18:43
Really sticky collection view layout
// The issue with sectionHeadersPinToVisibleBounds and sectionFootersPinToVisibleBounds is that they do not pin
// first header and last footer when bouncing. This layout subclass fixes that.
class StickyLayout: UICollectionViewFlowLayout {
override init() {
super.init()
self.sectionFootersPinToVisibleBounds = true
self.sectionHeadersPinToVisibleBounds = true
}
@ilyapuchka
ilyapuchka / lint.sh
Last active July 15, 2019 15:49
Run swiftlint only on files changed from the latest commit
!/bin/sh
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
FILES=($(git ls-files -m | grep ".*\.swift$" | grep -v ".*R.generated.swift$"))
if [[ ${FILES[@]} ]]; then
export "SCRIPT_INPUT_FILE_COUNT"="${#FILES[@]}"
for i in "${!FILES[@]}"; do
export "SCRIPT_INPUT_FILE_$i"="${FILES[$i]}"
done
@ilyapuchka
ilyapuchka / references.swift
Created July 24, 2017 21:18 — forked from chriseidhof/references.swift
References Blogpost
//: Playground - noun: a place where people can play
import Foundation
final class Disposable {
private let dispose: () -> ()
init(_ dispose: @escaping () -> ()) {
self.dispose = dispose
}
@ilyapuchka
ilyapuchka / Export in Paw.workflow
Last active December 22, 2017 19:38
Export to Paw automation script
// First make sure that you have granted access to Automator, Xcode and Paw in accessibility section in Security & Privacy settings.
// Then create a new Service workflow in Automator with following actions:
1. Copy to clipboard
2. Launch Application: "Paw"
3. Run AppleScript:
tell application "System Events"
tell process "Paw"
click menu item "Text" of menu 1 of menu item "Import" of menu 1 of menu bar item "File" of menu bar 1
@ilyapuchka
ilyapuchka / Enums.swift
Created November 6, 2017 20:58
Codable tips suggestions
/*
Instead of using enum it's possible to use RawRepresentable struct that will give you support for "unsupported" values,
but will cost you excastive switches (you'll alwyas have to handle default case, which will stand for those "unsupported" values)
It's defenetely more code than if using optional, but might be better if it comes to unwrapping this value everywhere.
*/
//enum System: String, Decodable {
// case ios, macos, tvos, watchos
//}
struct System: RawRepresentable, Decodable {