macOSに関してはよく知らない&Storyboardをみていないので軽めの回答になりますが、
- リーダブルコードという本を読む
- 命名を見直す
- パラメーター1〜3を抽象化したcustomViewを作る
- ボタン1〜3内のプロパティ代入を抽象化した関数を作る
- IBAction内のメソッドは可能な限り1行に纏める
- enumに定数を纏める
くらいは自分ならやります。
多分このコードが書かれてる場所ってViewController内だと思うのですがあまりにコード量が大きくなりすぎたら別クラスを作って分けたりもします。
リファクタリングに関して、というわけではありませんが素晴らしい記事があったのでリンクも貼っておきます。個人的には一番のお気に入りで何度も見返してます。
https://academy.realm.io/jp/posts/tryswift-daniel-steinberg-blending-cultures/
googleで「文化を調和させる swift」で調べるとこの記事を実践された方のコードがgithubにも上がってます。そちらも合わせて読むと分かりやすいですよ。
###追記
誰か何か回答してくれるんじゃないかと期待しながらちょくちょく見てたのですがあまり反応がないのでこっそり投稿です。とは言ってもmacOSは上記の通り門外漢ですのでiOSで同じような構成をとってます。またよく分からなかったものに関しては置き換え等々しています(senderの型のAnyとか)。なお命名に関してはかなりザル管理です。ここもっと良く出来るんじゃね?みたいな部分がありましたらご教授いただけましたら嬉しいです(とっても)。もし参考になれば幸いです。
swift
1
2//(6)
3enum containerType: Int {
4 case top = 0
5 case middle = 1
6 case bottom = 2
7}
8
9enum propertyType {
10 case typeA
11 case typeB
12 case typeC
13}
14
15enum properties {
16
17 static let defaultA: [String] = ["38000", "300", "0.5"]
18 static let defaultB: [String] = ["40000", "200", "0.6"]
19 static let defaultC: [String] = ["48000", "240", "0.55"]
20
21 static func pickupPropertiesSet(_ property: propertyType) -> (containerType) -> String {
22 switch property {
23 case .typeA:
24 return { (controller: containerType) -> String in
25 return defaultA[controller.rawValue]
26 }
27 case .typeB:
28 return { (controller: containerType) -> String in
29 return defaultB[controller.rawValue]
30 }
31 case .typeC:
32 return { (controller: containerType) -> String in
33 return defaultC[controller.rawValue]
34 }
35 }
36 }
37}
38
swift
1class ViewController: UIViewController {
2
3 var myFunctions = Functions()
4
5 //IBOutletCollection 三つ程度なら普段ならまとめたりしないです。
6 @IBOutlet var containers: [ParameterContainerView]!
7
8 //(5)
9 @IBAction func tapDefaultA(_ sender: UIButton) {
10 myFunctions.defaultProperties(typeOf: .typeA, containers: containers)
11 }
12 @IBAction func tapDefaultB(_ sender: UIButton) {
13 myFunctions.defaultProperties(typeOf: .typeB, containers: containers)
14 }
15 @IBAction func tapDefaultC(_ sender: UIButton) {
16 myFunctions.defaultProperties(typeOf: .typeC, containers: containers)
17 }
18
19 override func viewDidLoad() {
20 super.viewDidLoad()
21 }
22
23 override func didReceiveMemoryWarning() {
24 super.didReceiveMemoryWarning()
25 }
26
27}
swift
1//(3)
2class ParameterView: UIView {
3
4 @IBOutlet weak var firstTextField: UITextField!
5 @IBAction func actionFirstTextField(_ sender: UISlider) {
6 firstTextField.text = String(sender.value)
7 }
8
9 @IBOutlet weak var secondTextField: UITextField!
10 @IBAction func actionSecondTextField(_ sender: UISlider) {
11 secondTextField.text = String(sender.value)
12 }
13
14 func fill(with text: String) {
15 firstTextField.text = text
16 secondTextField.text = text
17 }
18
19}
swift
1//(3)
2class ParameterContainerView: UIView {
3
4 override init(frame: CGRect) {
5 super.init(frame: frame)
6 load()
7
8 }
9
10 required init?(coder aDecoder: NSCoder) {
11 super.init(coder: aDecoder)
12 load()
13 }
14
15 func load() {
16 if self.subviews.isEmpty {
17 let testView = ParameterView.instantiate()
18 testView.frame = self.bounds
19 self.addSubview(testView)
20 }
21 }
22
23 open func accessParameterView() -> ParameterView {
24 guard let view = self.subviews.first as? ParameterView else {
25 fatalError()
26 }
27 return view
28 }
29
30 func fill(with text: String) {
31 let parameterView = accessParameterView()
32 parameterView.fill(with: text)
33 }
34
35}
swift
1
2extension NSObject {
3 class var className: String {
4 return String(describing: self)
5 }
6
7 var className: String {
8 return type(of: self).className
9 }
10}
11
12protocol NibInstantiatable {}
13extension UIView: NibInstantiatable {}
14
15extension NibInstantiatable where Self: UIView {
16 static func instantiate(withOwner ownerOrNil: Any? = nil) -> Self {
17 let nib = UINib(nibName: self.className, bundle: nil)
18 return nib.instantiate(withOwner: ownerOrNil, options: nil)[0] as! Self
19 }
20}
21
swift
1class Functions {
2
3 private func callDefaultProperty(_ propertyType: propertyType) -> ((containerType) -> String) {
4 return properties.pickupPropertiesSet(propertyType)
5 }
6 //(4)
7 func defaultProperties(typeOf type: propertyType, containers: [ParameterContainerView]) {
8 containers.enumerated().forEach { (index, container) in
9 let text = callDefaultProperty(type)(containerType(rawValue: index)!)
10 container.fill(with: text)
11 }
12 }
13
14
15}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/15 00:48
2017/11/20 01:29
2017/11/20 02:09
2017/11/21 00:35