2017-01-09 8 views
0

私はSwiftの学習中に問題が発生しました。いくつかの変数を持つクラスがありますが、[CGColor]の配列を返して、UIViewでさまざまな背景グラデーションを作成したいと考えました。コードの配列を返す適切な方法とnilでない場合のチェック

一部は:それは私が空の文字列を割り当て、その後はnilかどう

class Xxx{ 
    var _output : String! 
    var _backgroundGradient : [CGColor]! 

    //checking if not nil 
    var output : String!{ 
     if _output == nil{ 
      _output = "" 
     } 
     return _output 
    } 

var backgroundGradient : [CGColor]{ 
    if _backgroundGradient?.isEmpty == false{ 
     print("There are objects!") 
    } else{ 
     print("There are no objects") 
     _backgroundGradient = [CGColor]() 
    } 
    return _backgroundGradient 
} 

だから、あなたが見ることができるよう_outputは、okです。

(...) 
    self._backgroundGradient.append(UIColor(red:1.00, green:0.79, blue:0.04, alpha:1.00).cgColor) 
    self._backgroundGradient.append(UIColor(red:0.97, green:0.41, blue:0.02, alpha:1.00).cgColor) 
    print("GRADIENT inside func -> \(self._backgroundGradient)") 
(...) 

と私は見ることができますように。私は、特定の値を追加する機能があるコードでさらに

を、配列と同じようなことを実行しようとしました、それは空の場合、空の配列を作成しなくゼロましたXcodeの下部コンソール、それが正しく表示されています:

GRADIENT inside func -> Optional([<CGColor 0x6000000b1340> [<CGColorSpace 0x6000000359e0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] (1 0.79 0.04 1), <CGColor 0x6080000b15e0> [<CGColorSpace 0x6000000359e0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] (0.97 0.41 0.02 1)]) 

を私はXXXクラスからbackgroundGradientを割り当てようとのviewDidLoad()で私のメインのViewControllerファイルに問題があります

(...) 
var classXxx : Xxx! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     classXxx = Xxx() 

     let gradient: CAGradientLayer = CAGradientLayer() 

     gradient.colors = classXxx.backgroundGradient 
     print("MainVC GRADIENT -> \(gradient.colors)") 
(...) 

と、コンソールの出力:

MainVC GRADIENT -> Optional([]) 

問題は、VaRのbackgroundGradientで復帰する必要があります。文字列、intなどの他のすべての変数は、魅力のように動作しますが、配列は問題です。

+4

。 – dan

+0

@danだからXxx()は空のbackgroundGradient配列を作成しますか?しかし、classXxx = Xxx()を作成せずにbackgroundGradientを取得することはできますか?あなたは助けて問題を解決できますか? – codddeer123

答えて

1

問題は、backgroundGradient配列に色を追加する関数を呼び出さないということです。

このコードスニペットを変更して、Xxxオブジェクトの作成後に関数を呼び出す必要があります。

(...) 
var classXxx : Xxx! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     classXxx = Xxx() 

     // Call function to add colors to the backgroundGradient array 
     classXxx.addColors() // Change 'addColors()' to the name of the function which contains the lines of code quoted below 

     let gradient: CAGradientLayer = CAGradientLayer() 

     gradient.colors = classXxx.backgroundGradient 
     print("MainVC GRADIENT -> \(gradient.colors)") 
(...) 

-

func addColors() { 
    (...) 
     self._backgroundGradient.append(UIColor(red:1.00, green:0.79, blue:0.04, alpha:1.00).cgColor) 
     self._backgroundGradient.append(UIColor(red:0.97, green:0.41, blue:0.02, alpha:1.00).cgColor) 
     print("GRADIENT inside func -> \(self._backgroundGradient)") 
    (...) 
} 

-

EDIT:

あなたは、デフォルト値を使用して、変数を初期化することによって、あなたのクラスを簡素化することができます。例えば

あなたは `xxxは()`あなたが空から始まり、それ自身の配列を使用して、クラスの新しいインスタンスを作成しているん
class Xxx { 
    var output : String = "" 
    var backgroundGradient : [CGColor] = [ 
     UIColor(red:1.00, green:0.79, blue:0.04, alpha:1.00).cgColor, 
     UIColor(red:0.97, green:0.41, blue:0.02, alpha:1.00).cgColor 
    ] 
} 
+0

ああ、私が間違っていたのは間違った場所で機能を呼び出すことだけだったということです。今はうまくいっていますが、おそらくもっと良い方法がありますか?手伝ってくれてありがとう! – codddeer123

+0

私はあなたが何を望んでいるのか分かりません。あなたはclassXxxが常にその2つの色を持つことから始めたいですか? –

関連する問題