2016-08-22 51 views
-1

我正試圖用較短的方式編寫下面的代碼。你如何製作一個函數來設置其他實例的屬性?

func colourChangeIfDeletionCancelled(word:Int){ 
    for i in 0...selectedWords[word].count - 1 { 
     let square = selectedWords[word][i] 

    arrayOfRows[square.0][square.1].topToRight.backgroundColor = nil 
    arrayOfRows[square.0][square.1].topToLeft.backgroundColor = nil 
    arrayOfRows[square.0][square.1].bottomToRight.backgroundColor = nil 
    arrayOfRows[square.0][square.1].bottomToLeft.backgroundColor = nil 
    arrayOfRows[square.0][square.1].horizontalTube.backgroundColor = nil 
    arrayOfRows[square.0][square.1].verticalTube.backgroundColor = nil 
    arrayOfRows[square.0][square.1].endFromLeft.backgroundColor = nil 
    arrayOfRows[square.0][square.1].endFromRight.backgroundColor = nil 
    arrayOfRows[square.0][square.1].endFromTop.backgroundColor = nil 
    arrayOfRows[square.0][square.1].endFromBottom.backgroundColor = nil 

    } 
} 

此代碼有效,但我確信有一個更好(更短)的方法來編寫它,但我不確定如何。我試圖做一個函數,將子視圖作爲一個變量,但在如何做到這一點上丟失了。我相信這不是最難的問題,但我堅持它,任何幫助表示讚賞。

編輯:

arrayOfRows就是一個類的數組的數組我創建了一個叫做LetterSquareView

class LetterSquareView: UIView { 
var letter:String! 

@IBOutlet weak var topToLeft: UIView! 
@IBOutlet weak var topToRight: UIView! 
@IBOutlet weak var bottomToRight: UIView! 
@IBOutlet weak var bottomToLeft: UIView! 
@IBOutlet weak var horizontalTube: UIView! 
@IBOutlet weak var verticalTube: UIView! 
@IBOutlet weak var endFromLeft: UIView! 
@IBOutlet weak var endFromRight: UIView! 
@IBOutlet weak var endFromTop: UIView! 
@IBOutlet weak var endFromBottom: UIView! 

@IBOutlet weak var topToLeftWhiteSpace: UIView! 
@IBOutlet weak var topToRightWhiteSpace: UIView! 
@IBOutlet weak var bottomToRightWhiteSpace: UIView! 
@IBOutlet weak var bottomToLeftWhiteSpace: UIView! 

@IBOutlet weak var letterSquareViewView: LetterSquareViewView! 
@IBOutlet var letterSquareView: UIView! 
@IBOutlet weak var letterLbl: UILabel! 

init(frame: CGRect, letter: String) { 

    super.init(frame: frame) 

    NSBundle.mainBundle().loadNibNamed("LetterSquareView", owner: self, options: nil) 

    letterLbl.text = letter.capitalizedString 
    self.letter = letter 
    self.addSubview(letterSquareView) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 
} 

,我試圖改變背景顏色有背景色設置時,子視圖他們被創建。我試圖刪除它們時刪除該顏色。我認爲會有一個功能,你可以輸入一個視圖的數組,並輸入一個屬性來設置,它會被設置,但我找不到任何類型的東西。

+1

什麼是'arrayOfRows',什麼是'square'? 'arrayOfRows'中元素的類型是什麼? – Alexander

+1

您希望我們幫助您提高數據結構的使用率,而無需向我們提供有關數據結構的任何信息。那該怎麼辦? – Alexander

+0

您是否包含arrayOfRows的每個子視圖?或特定類別的每個子視圖。 – Sethmr

回答

1

我想最直接的方法是有:

func clearBackgroundColors(e: WhateverViewThisIs) { 
     for view in [e.topToRight, e.topToLeft, etc. ] { 
      view.backgroundColor = nil 
     } 
} 

clearBackgroundColors(arrayOfRows[square.0][square.1]) 

一個很好的問題思考是關於類的責任。我認爲arrayOfRows[][]中的觀點應該是私人的子視圖,他們的知識可能是實現細節,而不是公衆知識。所以clearBackgroundColors()方法應該放置在那裏,而不是從更全局的地方設置所有顏色。

+0

考慮到我們需要處理的信息有限,這是一個很好的答案,但是我認爲數據結構中的更重要的改進可能是可能的。 – Alexander

+0

我同意。有可能是潛在的設計問題導致這個問題。 – Seurahepo

0
import UIKit 

var arrayOfRows: [[UIView]] = [[]] 
let square: (Int, Int)! 

一個方法,使您touple代碼更加清晰:

//extracting touple 
let (row, col) = square 
arrayOfRows[row][col].topToRight.backgroundColor = nil 

僅使用這就是你確定要進行背景色零這一觀點的所有子視圖。

//for all views 
for arrayOfColumns in arrayOfRows { 
    for views in arrayOfColumns { 
     for subview in views.subviews { 
      subview.backgroundColor = nil 
     } 
    } 
} 

這是我建議如何處理它。這也使您可以使用OOP設計進一步自定義這些視圖。那麼你可以

//with class type 
//use this if there are other subviews 
//make all your views in your list a CustomViewToMakeNil 
class CustomViewToMakeNil: UIView { 
    //set the views content 
} 

for arrayOfColumns in arrayOfRows { 
    for views in arrayOfColumns { 
     for subview in views.subviews { 
      //check if they are of the type you want to make the color nil 
      if subview is CustomViewToMakeNil { 
       subview.backgroundColor = nil 
      } 
     } 
    } 
} 
相關問題