2017-10-02 12 views
0

私はアプリケーションのスタイルを管理するための列挙型を作成しました。その場合、その列挙型はUIColor型またはCAGradientLayerを返すようにします。これは私が持っているコードですが、実際にはうまくいきますが、毎回私が使用するたびに、私はダウンキャストしなければなりません。ダウンキャストされた価値を返す方法はありますか?ダウンキャスト型を返す

import UIKit 

enum Theme { 
    case darkBackground 
    case lightBackground 
    case gradientBackground 
    case darkText 
    case lightText 
} 

extension Theme { 

    var value: Any { 
     var instanceColor: UIColor = .clear 
     var gradient: CAGradientLayer? 
     switch self { 
     case .darkBackground: 
      instanceColor = .black 
     case .lightBackground: 
      instanceColor = UIColor(white: 0.9, alpha: 1) 
     case .darkText: 
      instanceColor = .darkText 
     case .lightText: 
      instanceColor = UIColor(white: 0.9, alpha: 1) 
     case .gradientBackground: 
      gradient = CAGradientLayer() 
      gradient?.colors = [UIColor.init(hexString: "#516395").cgColor, UIColor.init(hexString: "#614385").cgColor] 

     } 

     return gradient != nil ? gradient : instanceColor 
    } 
} 

使用例

class ViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 
    view.backgroundColor = Theme.lightBackground.value as? UIColor 
} 
+0

を、あなたが実際に[値]を使用するいくつかのコードを表示することができますか? – luk2302

+0

@ luk2302使用例を更新しました。 –

+0

Swiftのタイプのシステムのためにこれが可能であるとは思わないでください。より洗練された解決策は、 'UIColor'と' CAGradientLayer'を 'UIColor.light'、' UIColor.dark'などの静的変数で拡張することです。 –

答えて

0

あなたがAnyを取り除くことができUIColorまたはCAGradientLayerのいずれかになりますenumを作成する場合。この場合に役立ちます...もちろん

import UIKit 

enum ColourOrGradient { 
    case colour(UIColor) 
    case gradient(CAGradientLayer) 
    var colourGradient: (UIColor?, CAGradientLayer?) { 
     switch self { 
     case .colour(let c): 
      return (c, nil) 
     case .gradient(let g): 
      return (nil, g) 
     } 
    } 
} 

enum Theme { 
    case darkBackground 
    case lightBackground 
    case gradientBackground 
    case darkText 
    case lightText 
} 

extension Theme { 

    var value: ColourOrGradient { 
     switch self { 
     case .darkBackground: 
      return ColourOrGradient.colour(.black) 
     case .lightBackground: 
      return ColourOrGradient.colour(UIColor(white: 0.9, alpha: 1)) 
     case .darkText: 
      return ColourOrGradient.colour(.darkText) 
     case .lightText: 
      return ColourOrGradient.colour(UIColor(white: 0.9, alpha: 1)) 
     case .gradientBackground: 
      let gradient = CAGradientLayer() 
      gradient.colors = [UIColor.blue.cgColor, UIColor.green.cgColor] // Your `.hexString` not supplied 
      return ColourOrGradient.gradient(gradient) 
     } 
    } 
} 

var gradient: CAGradientLayer? 
var colour: UIColor? 
(colour, gradient) = Theme.lightBackground.value.colourGradient 

を参照してください、あなたもこれを行うことができます:

import UIKit 

enum Theme { 
    case darkBackground 
    case lightBackground 
    case gradientBackground 
    case darkText 
    case lightText 
} 

extension Theme { 

    var value: (UIColor?, CAGradientLayer?) { 
     switch self { 
     case .darkBackground: 
      return (.black, nil) 
     case .lightBackground: 
      return (UIColor(white: 0.9, alpha: 1), nil) 
     case .darkText: 
      return (.darkText, nil) 
     case .lightText: 
      return (UIColor(white: 0.9, alpha: 1), nil) 
     case .gradientBackground: 
      let gradient = CAGradientLayer() 
      gradient.colors = [UIColor.blue.cgColor, UIColor.green.cgColor] // Your `.hexString` not supplied 
      return (nil, gradient) 
     } 
    } 
} 

var gradient: CAGradientLayer? 
var colour: UIColor? 
(colour, gradient) = Theme.lightBackground.value 
+0

これは二つのタイプの結果。 – rmaddy

+0

@rmaddy、私はOPがどのようにそれを使用するのか分かっていませんが、可能な体系を与えるために答えを更新しました。 – Grimxn

+0

これはどちらも機能しません。ColourOrGradientタイプを返すので、UIColorまたはCAGradientLayerタイプに割り当てることはできません。 –

関連する問題