Skip to content

Instantly share code, notes, and snippets.

@denkeni
denkeni / SwiftSyntaxDesignComplexity.md
Last active August 29, 2015 14:24
Swift Syntax Design Complexity

Check Class/Type

Objective-C

What you need to know are isKindOfClass: and class:

A *a = [[A alloc] init];
Class AClass = [A class];

BOOL isAClass1 = [a isKindOfClass:[A class]];
@denkeni
denkeni / apple-watch-password-lock-mechanism.md
Last active August 29, 2015 14:24
How Apple Watch Password Lock Works
addObserver(IPHONE_DID_UNLOCKED) {
  if isOnSkin {
    locked = false
  }
}

addObserver(WATCH_OFF_SKIN) {
  locked = true
}
@denkeni
denkeni / SwiftErrorHandling.swift
Created November 18, 2015 11:23
Swift Error Handling - A Better Way
//: Playground - noun: a place where people can play
// 1. Proposed Error Handling
enum Error: ErrorType {
case IsNegative(String)
case IsPositive(String)
}
func isZero(number: Int) -> Error? {
if number != 0 {
@denkeni
denkeni / Auto-Layout-Programmatically-1-1.swift
Last active March 27, 2017 14:50
Auto Layout Programmatically 1-1
subviewA.translatesAutoresizingMaskIntoConstraints = false // 這是純程式碼寫 Auto Layout 的大雷:必須設定這一行!
view.addSubview(subviewA)
var constraints = [NSLayoutConstraint]()
constraints.append(NSLayoutConstraint(item: subviewA, attribute: .centerX, relatedBy: .equal,
toItem: view, attribute: .centerX, multiplier: 1.0, constant: 0))
// subviewA.centerX = 1.0 * view.centerX + 0 即 subviewA.centerX = view.centerX
constraints.append(NSLayoutConstraint(item: subviewA, attribute: .centerY, relatedBy: .equal,
toItem: view, attribute: .centerY, multiplier: 1.0, constant: 0))
// subviewA.centerY = 1.0 * view.centerY + 0 即 subviewA.centerY = view.centerY
constraints.append(NSLayoutConstraint(item: subviewA, attribute: .width, relatedBy: .equal,
@denkeni
denkeni / Auto-Layout-Programmatically-1-2.swift
Last active March 27, 2017 14:50
Auto Layout Programmatically 1-2
subviewB.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(subviewB)
constraints.append(NSLayoutConstraint(item: subviewB, attribute: .top, relatedBy: .equal,
toItem: view, attribute: .top, multiplier: 1.0, constant: 150))
// subviewA.top = 1.0 * view.top + 150
constraints.append(NSLayoutConstraint(item: subviewB, attribute: .bottom, relatedBy: .equal,
toItem: view, attribute: .bottom, multiplier: 1.0, constant: -150))
// subviewA.bottom = 1.0 * view.bottom - 150
constraints.append(NSLayoutConstraint(item: subviewB, attribute: .left, relatedBy: .equal,
toItem: view, attribute: .left, multiplier: 1.0, constant: 100))
@denkeni
denkeni / Auto-Layout-Programmatically-1-3.swift
Last active March 27, 2017 14:50
Auto Layout Programmatically 1-3
subviewC.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(subviewC)
constraints.append(subviewC.centerXAnchor.constraint(equalTo: view.centerXAnchor))
constraints.append(subviewC.centerYAnchor.constraint(equalTo: view.centerYAnchor))
constraints.append(subviewC.widthAnchor.constraint(equalToConstant: 200))
constraints.append(subviewC.heightAnchor.constraint(equalToConstant: 100))
@denkeni
denkeni / Auto-Layout-Programmatically-2-1.swift
Created April 4, 2017 03:53
Auto Layout Programmatically 2-1
let viewsDictB = ["subviewB": subviewB]
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(150)-[subviewB]-(150)-|",
options: [], metrics: nil, views: viewsDictB)
// V: Vertical
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-(100)-[subviewB]-(100)-|",
options: [], metrics: nil, views: viewsDictB)
// H: Horizontal
@denkeni
denkeni / Auto-Layout-Programmatically-2-2.swift
Last active April 4, 2017 04:00
Auto Layout Programmatically 2-2
let metrics = ["v": 150, "h": 100]
let viewsDictB = ["subview": subviewB]
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(v)-[subview]-(v)-|",
options: [], metrics: metrics, views: viewsDictB)
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-(h)-[subview]-(h)-|",
options: [], metrics: metrics, views: viewsDictB)
@denkeni
denkeni / Auto-Layout-Programmatically-2-3.swift
Created April 4, 2017 04:02
Auto Layout Programmatically 2-3
let viewsDictA = ["subviewA": subviewA]
constraints.append(subviewA.centerXAnchor.constraint(equalTo: view.centerXAnchor))
constraints.append(subviewA.centerYAnchor.constraint(equalTo: view.centerYAnchor))
// width
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:[subviewA(200)]",
options: [], metrics: nil, views: viewsDictA)
// height
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:[subviewA(100)]",
options: [], metrics: nil, views: viewsDictA)
@denkeni
denkeni / Auto-Layout-Programmatically-2-4.swift
Last active April 4, 2017 04:04
Auto Layout Programmatically 2-4
let metrics = ["p": 15] // padding
let viewsDict = ["subview1": subview1, "subview2": subview2, "subview3": subview3]
constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|-(p)-[subview1(100)]-(10)-[subview2(120)]-(10)-[subview3]-(p)-|",
options: [], metrics: metrics, views: viewsDict)
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(p)-[subview1]-(p)-|",
options: [], metrics: metrics, views: viewsDict)
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(p)-[subview2]-(p)-|",
options: [], metrics: metrics, views: viewsDict)
constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-(p)-[subview3]-(p)-|",
options: [], metrics: metrics, views: viewsDict)