Skip to content

Instantly share code, notes, and snippets.

@ktanaka117
Last active October 21, 2017 07:23
Show Gist options
  • Save ktanaka117/7b4297df110d3e40722100badca9a0ae to your computer and use it in GitHub Desktop.
Save ktanaka117/7b4297df110d3e40722100badca9a0ae to your computer and use it in GitHub Desktop.
https://speakerdeck.com/lovee/modannainisiyaraiza ←について考えてみた
import UIKit
public struct UILabelMaker {
let label: UILabel
}
extension UILabelMaker {
public func set(textColor color: UIColor) -> UILabelMaker {
self.label.textColor = color
return self
}
public func set(numberOfLines number: Int) -> UILabelMaker {
self.label.numberOfLines = number
return self
}
// public func set(_ alignment: NSTextAlignment) -> UILabelMaker {
// self.label.textAlignment = alignment
// return self
// }
public func set(textAlignment alignment: NSTextAlignment) -> UILabelMaker {
self.label.textAlignment = alignment
return self
}
// public func set(_ mode: NSLineBreakMode) -> UILabelMaker {
// self.label.lineBreakMode = mode
// return self
// }
public func set(lineBreakMode mode: NSLineBreakMode) -> UILabelMaker {
self.label.lineBreakMode = mode
return self
}
// public func set(_ font: UIFont) -> UILabelMaker {
// self.label.font = font
// return self
// }
public func set(font: UIFont) -> UILabelMaker {
self.label.font = font
return self
}
}
extension UILabel {
// 関数名は init() ではなく make() のままで良いと思った
// ・バッククォートを使うのは非推奨ってのをじっちゃに聞いた
// ・既存のinitとは違う実装をしていて、Builderを使っているという意図を残すため
// public static func `init`(frame: CGRect = .zero, by making: (UILabelMaker) -> UILabelMaker) -> UILabel {}
public static func make(withFrame frame: CGRect = .zero, by making: (UILabelMaker) -> UILabelMaker) -> UILabel {
let label = UILabel(frame: frame)
let maker = UILabelMaker(label: label)
let resultMaker = making(maker)
let resultLabel = resultMaker.label
return resultLabel
}
}
let label = UILabel.make { $0
.set(textColor: .red)
.set(numberOfLines: 0)
// ・NSTextAlignment, NSLineBreakModeについては型情報で意味がわかるから引数名を省略していいと思ったけど、パッと見たときに .center, .byWordWrapping だけだと何を設定しているのかわからなかったので、
// 引数名をやっぱりつけた。
// ・UIFontに関してはよく使うし、馴染みがあって、fontとかのキーワードがcase名についてるから、引数名を省略しても後で読んだときに違和感を感じないと思ったけど、
// 上に書いたNSTextAlignmentとかとインターフェースの名付けルールに揃えるために引数名をつけた
// .set(.center)
.set(textAlignment: .center)
// .set(.byWordWrapping)
.set(lineBreakMode: .byWordWrapping)
// .set(.systemFont(ofSize: 20))
.set(font: .systemFont(ofSize: 20))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment