Last active
July 12, 2017 00:41
-
-
Save erica/c24017dd643b4dfcf9117909af8127f4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
A0 B0 Optional("A0") Optional("A0") | |
A0 B1 Optional("A0") Optional("A0") | |
A0 B2 Optional("A0") Optional("A0") | |
A0 B3 Optional("A0") Optional("A0") | |
A0 B4 Optional("A0") Optional("A0") | |
A0 B5 Optional("A0") Optional("A0") | |
A1 B0 Optional("A0") Optional("A0") | |
A1 B1 Optional("A1") Optional("A1") | |
A1 B2 Optional("A1") Optional("A1") | |
A1 B3 Optional("A1") Optional("A1") | |
A1 B4 Optional("A1") Optional("A1") | |
A1 B5 Optional("A1") Optional("A1") | |
A2 B0 Optional("A0") Optional("A0") | |
A2 B1 Optional("A1") Optional("A1") | |
A2 B2 Optional("A2") Optional("A2") | |
A2 B3 Optional("A2") Optional("A2") | |
A2 B4 Optional("A2") Optional("A2") | |
A2 B5 Optional("A2") Optional("A2") | |
A3 B0 Optional("A0") Optional("A0") | |
A3 B1 Optional("A1") Optional("A1") | |
A3 B2 Optional("A2") Optional("A2") | |
A3 B3 Optional("A3") Optional("A3") | |
A3 B4 Optional("A3") Optional("A3") | |
A3 B5 Optional("A3") Optional("A3") | |
A4 B0 Optional("A0") Optional("A0") | |
A4 B1 Optional("A1") Optional("A1") | |
A4 B2 Optional("A2") Optional("A2") | |
A4 B3 Optional("A3") Optional("A3") | |
A4 B4 Optional("A4") Optional("A4") | |
A4 B5 Optional("A4") Optional("A4") | |
A5 B0 Optional("A0") Optional("A0") | |
A5 B1 Optional("A1") Optional("A1") | |
A5 B2 Optional("A2") Optional("A2") | |
A5 B3 Optional("A3") Optional("A3") | |
A5 B4 Optional("A4") Optional("A4") | |
A5 B5 Optional("A5") Optional("A5") | |
A0 A0 Optional("A0") Optional("A0") | |
A0 A1 Optional("A0") Optional("A0") | |
A0 A2 Optional("A0") Optional("A0") | |
A0 A3 Optional("A0") Optional("A0") | |
A0 A4 Optional("A0") Optional("A0") | |
A0 A5 Optional("A0") Optional("A0") | |
A1 A0 Optional("A0") Optional("A0") | |
A1 A1 Optional("A1") Optional("A1") | |
A1 A2 Optional("A1") Optional("A1") | |
A1 A3 Optional("A1") Optional("A1") | |
A1 A4 Optional("A1") Optional("A1") | |
A1 A5 Optional("A1") Optional("A1") | |
A2 A0 Optional("A0") Optional("A0") | |
A2 A1 Optional("A1") Optional("A1") | |
A2 A2 Optional("A2") Optional("A2") | |
A2 A3 Optional("A2") Optional("A2") | |
A2 A4 Optional("A2") Optional("A2") | |
A2 A5 Optional("A2") Optional("A2") | |
A3 A0 Optional("A0") Optional("A0") | |
A3 A1 Optional("A1") Optional("A1") | |
A3 A2 Optional("A2") Optional("A2") | |
A3 A3 Optional("A3") Optional("A3") | |
A3 A4 Optional("A3") Optional("A3") | |
A3 A5 Optional("A3") Optional("A3") | |
A4 A0 Optional("A0") Optional("A0") | |
A4 A1 Optional("A1") Optional("A1") | |
A4 A2 Optional("A2") Optional("A2") | |
A4 A3 Optional("A3") Optional("A3") | |
A4 A4 Optional("A4") Optional("A4") | |
A4 A5 Optional("A4") Optional("A4") | |
A5 A0 Optional("A0") Optional("A0") | |
A5 A1 Optional("A1") Optional("A1") | |
A5 A2 Optional("A2") Optional("A2") | |
A5 A3 Optional("A3") Optional("A3") | |
A5 A4 Optional("A4") Optional("A4") | |
A5 A5 Optional("A5") Optional("A5") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
public extension UIView { | |
// Return nearest common ancestor between two views | |
public func nearestCommonAncestor(with otherView: UIView) -> UIView? { | |
var mySuperviews = sequence(first: self, next: { $0.superview }).reversed().makeIterator() | |
var theirSuperviews = sequence(first: otherView, next: { $0.superview }).reversed().makeIterator() | |
var nca: UIView? = nil | |
while var mine = mySuperviews.next(), var theirs = theirSuperviews.next(), mine === theirs { | |
nca = mine | |
} | |
return nca | |
} | |
public func nca(with otherView: UIView) -> UIView? { | |
let mySuperviews = sequence(first: self, next: { $0.superview }) | |
let theirSuperviews = Set(sequence(first: otherView, next: { $0.superview })) | |
return mySuperviews.first(where: theirSuperviews.contains) | |
} | |
} | |
public var sharedNametagKey: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer.allocate(capacity: 1) | |
public extension NSObject { | |
public var nametag: String? { | |
get {return objc_getAssociatedObject(self, &sharedNametagKey) as? String} | |
set { | |
if let newNameTag = newValue { | |
// Store unwrapped new value | |
objc_setAssociatedObject(self, &sharedNametagKey, newNameTag, .OBJC_ASSOCIATION_RETAIN) | |
} else { | |
// Remove by assignment to nil | |
objc_setAssociatedObject(self, &sharedNametagKey, nil, .OBJC_ASSOCIATION_RETAIN) | |
} | |
} | |
} | |
} | |
let viewsA = (0...5).map({ _ in UIView() }) | |
let viewsB = (0...5).map({ _ in UIView() }) | |
(0...4).forEach { viewsA[$0].addSubview(viewsA[$0 + 1])} | |
(0...5).forEach { viewsA[$0].addSubview(viewsB[$0])} | |
(0 ... 5).forEach { | |
viewsA[$0].nametag = "A\($0)" | |
viewsB[$0].nametag = "B\($0)" | |
} | |
for (v1, v2) in CartesianSequence(viewsA, viewsB) { | |
print(v1.nametag!, v2.nametag!, v1.nearestCommonAncestor(with: v2)?.nametag!, v1.nca(with: v2)?.nametag!) | |
} | |
for (v1, v2) in CartesianSequence(viewsA, viewsA) { | |
print(v1.nametag!, v2.nametag!, v1.nearestCommonAncestor(with: v2)?.nametag!, v1.nca(with: v2)?.nametag!) | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment