「Swift」タグアーカイブ

ViewControllerを別のViewControllerの任意ビューにはめ込む処理

public extension UIView {

    public func fillSuperviewWithConstaints() {

        let constraints = NSLayoutConstraint.constraints(fillingSuperviewOf: self)

        if #available(iOS 8, *) {
            NSLayoutConstraint.activate(constraints)
        } else {
            if let superview = superview {
                superview.addConstraints(constraints)
            }
        }
    }

}

public extension NSLayoutConstraint {

    public static func constraints(fillingSuperviewOf view: UIView) -> [NSLayoutConstraint] {
        guard let superview = view.superview else {
            return []
        }

        return [NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: superview, attribute: .top, multiplier: 1.0, constant: 0.0),
                NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: superview, attribute: .bottom, multiplier: 1.0, constant: 0.0),
                NSLayoutConstraint(item: view, attribute: .leading, relatedBy: .equal, toItem: superview, attribute: .leading, multiplier: 1.0, constant: 0.0),
                NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem: superview, attribute: .trailing, multiplier: 1.0, constant: 0.0),
        ]
    }

}

public extension UIViewController {

    public func addChildViewController(_ childViewController: UIViewController, filling parentView: UIView, withContraints: Bool) {

        addChildViewController(childViewController)
        childViewController.didMove(toParentViewController: self)

        if let subView = childViewController.view {
            parentView.addSubview(subView)

            if withContraints {
                subView.translatesAutoresizingMaskIntoConstraints = false
                subView.fillSuperviewWithConstaints()
            } else {
                subView.frame = parentView.bounds
            }
        }
    }

}

Protocol and Value Oriented Programming in UIKit Apps

WWDC2016で、Swiftのstruct、protocol、enumの有効な使い方について紹介するセッションがあった。

Protocol and Value Oriented Programming in UIKit Apps (WWDC 2016 – Session 419)

そのセッションで使われたサンプルコードがこちら。

LucidDreams: Protocol and Value Oriented Programming Sample Code

とても興味深くて、勉強になると思ったが、まだマスターできていない。

Swift でシングルトン

単純なシングルトン

class Feature {
    static let instance = Feature()
}
  • 最初のアクセスのときにインスタンスが作られる。
  • スレッドセーフである。

明示的に初期化・開放するシングルトン

class Feature {
    static var instance: Feature {
        return _instance
    }

    static func initializeInstance() {
        _instance = Feature()
    }

    static func finalizeInstance() {
        _instance = nil
    }

    private static var _instance: Feature! = nil
}
  • スレッドセーフではない。でも明示的にインスタンスするならそこは使う側が注意している前提。

その他の考慮

  • init を private にすれば、外部でのインスタンス作成を防げる。でも使う側はそんなバカではないはずだし、仮に間違った使い方をされたら議論したいのでオープンにしておきたい。
  • Objective-C でも使うなら public クラスにして NSObject を派生し、 init を override。