Skip to content

Instantly share code, notes, and snippets.

View zats's full-sized avatar

Sash Zats zats

View GitHub Profile
@zats
zats / File.swift
Last active January 9, 2017 05:11
Kill compiler with this one weird trick
import UIKit
class ViewController: UIViewController {
private var a1: Int!
private var a2: Int!
private var a3: Int!
private var a4: Int!
private var a5: Int!
private var a6: Int!
@zats
zats / Models.swift
Last active August 10, 2017 19:49 — forked from JaviSoto/SampleViewController.swift
Init based Storyboard View Controller Instantiation
import Foundation
// Some clearly non-NSObject-based models:
enum Coconut: String {
case small, medium, large
}
struct Tomato {
static var red = Tomato(color: #colorLiteral(red: 0.7490196078, green: 0.09803921569, blue: 0.02352941176, alpha: 1))
@zats
zats / Podfile
Last active July 20, 2016 22:55
target '…' do
end
post_install do |installer_or_rep|
installer = installer_or_rep.respond_to?(:installer) ? installer_or_rep.installer : installer_or_rep
installer.pods_project.build_configurations.each do |config|
# Only in debug
if config.name.include?("Debug")
@zats
zats / usage.swift
Created July 16, 2016 06:01
Optional escape operator
// flow controll using do-catch
do {
try commentBody(¿commentRangeBeforeOffset(¿getNameOffset(dictionary)))
} catch let e as OptionalError {
} catch {
}
// folding into optional value. Currently produces double optional
@zats
zats / pubsub.swift
Last active May 26, 2016 21:16
PubSub protocol
protocol PubSubMessageType {
associatedtype Topic
var topic: Topic { get }
}
protocol PubSubType {
associatedtype Message = PubSubMessageType
associatedtype Topic
@zats
zats / Problem.swift
Last active November 4, 2021 08:40
Recursive structures in Swift without Box classes
struct Node<T> { // error: recursive value type 'Node<T>' is not allowed
var child: Node?
var value: T
init(value: T, child: Node? = nil) {
self.value = value
self.child = child
}
}
class Parent {
var child: Child? {
didSet {
child.callback = weak(self)?.delegateCallback
}
}
func delegateCallback() {
// ...
@zats
zats / retain-cycle.swift
Last active January 4, 2016 18:02
Delegate-pattern without a weak delegate object creates retain cycle
class Parent {
var child: Child? {
didSet {
child.callback = delegateCallback // Fix: child.callback = weakify(self, Parent.delegateCallback) using https://github.com/klundberg/Weakify/blob/master/Weakify/Weakify.swift#L15-L21
}
}
func delegateCallback() {
// ...
}
@zats
zats / README.md
Last active July 2, 2019 10:45
UIPreviewActionItem for SFSafariViewController through delegation not subclassing

Adding UIPreviewActionItem to SFSafariViewController might be a tedious task. This extansion should help.

let vc = SFSafariViewController(initialURL: url, entersReaderIfAvailable: true)
vc.previewActionItemsDelegate = self

When presenting SFSafariViewController use convenience initializer that will store original URL for later, it'll make custom action requiring original URL easier. But it's not mandatory.

Here is the delegate implementation, this is where we might want to use initialURL

func safariViewControllerPreviewActionItems(controller: SFSafariViewController) -> [UIPreviewActionItem] {
@zats
zats / UIViewController.m
Last active October 5, 2015 02:35
UIViewController implementation details for view and loadViewIfNeeded
- (UIView *)view {
[self loadViewIfRequired];
return _existingView;
}
- (void)loadViewIfNeeded {
[self loadViewIfRequired];
}