2017-08-21 29 views
1

我們假設myVar具有相同功能在每個執行查看。我想弄清楚如何聲明/暴露某種集合屬性,而不是將它們分配n次(每創建一個新的視圖),但沒有任何東西出現在我的腦海中。我怎麼能重構一行&一次性任務?如何使用一個變量/屬性,而不是分配相同的屬性三次?

var myVar: (()-> Void)? 

private func callBack() { 
    someClass.view1.myVar = self.myVar 
    someClass.view2.myVar = self.myVar 
    someClass.view3.myVar = self.myVar 
} 

// MARK: - someClass pseudocode 

someClass: class { 
    let view1: CustomView: = CustomView 
    let view2: CustomView: = CustomView 
    let view3: CustomView: = CustomView 
} 

// MARK: - customView pseudocode 

class CustomView: UIView { 
    var myVar: (()-> Void)? 
} 

回答

2

這樣的事情,但在一個陣列,具有所有CustomViews是好主意,可以在這裏實現,以及

var a: (() -> Void)? 

class CustomView: UIView { 
    var myVar: (() -> Void)? 
} 

class SomeClass { 
    let view1 = CustomView() 
    let view2 = CustomView() 
    let view3 = CustomView() 
    var myVar: (() -> Void)? { 
     set { 
      self.view2.myVar = newValue 
      self.view1.myVar = newValue 
      self.view3.myVar = newValue 
     } 

     get { 
      return self.myVar 
     } 
    } 
} 

let b = SomeClass() 
b.myVar = ({print(3)}) 
b.view1.myVar!() 
1

這是你正在嘗試做什麼?

[someClass.view1, someClass.view2, someClass.view3].forEach { $0.myVar = self.myVar }

+0

這是聰明的,但這樣做基本上是相同的,只是語法非常** ** SWIFTY。 它仍然分配myVar三次。 – Drwalcore

+0

我試圖做到這一點,但** $ 0 **是不可變的,因爲我試圖分配類似的東西'{$ 0.myVar = {self.myVar?()}}'' – Drwalcore

0

這是我傾向於處理這些問題:

class OtherClass { 
    var text: String? 
    init(text: String?) { 
     self.text = text; 
    } 
} 
class TestClass { 
    var thing1: OtherClass? 
    var thing2: OtherClass? 
    var thing3: OtherClass? 


    var allTheThings: [OtherClass?] { return [thing1, thing2, thing3]} 

    var ownText: String? { 
     didSet { 
      allTheThings.forEach { $0?.text = ownText } 
     } 
    } 
} 

根據你希望改變的東西的多少,你可以使數組屬性在你的init中設置的常量而不是一個comp沒有財產。

如果你想獲得看上你也可以做這樣的事情設置:

private var allTheThings: [OtherClass?] { 
     get { 
      return [thing1, thing2, thing3] 
     } 
     set { 
      guard newValue.count == 3 else { 
       //probably should put an assertion in here 
       return 
      } 
      thing1 = newValue[0] 
      thing2 = newValue[1] 
      thing3 = newValue[2] 
     } 
    } 

    init() { 
     self.allTheThings = Array(repeating: OtherClass(text: "Test"), count: 3) 
    } 
相關問題