2017-12-14 12 views
0

私が直接アルファを変更するUIColorの拡張を書いた:迅速UIColorの拡張

public extension UIColor { 

    public var rgbaComponents: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) { 
     var components: [CGFloat] { 
      let c = cgColor.components! 
      if c.count == 4 { 
       return c 
      } 
      return [c[0], c[0], c[0], c[1]] 
     } 
     let r = components[0] 
     let g = components[1] 
     let b = components[2] 
     let a = components[3] 
     return (red: r, green: g, blue: b, alpha: a) 
    } 

    public var alpha: CGFloat { 
     get { 
      return cgColor.alpha 
     } 
     set { 
      var rgba = rgbaComponents 
      self = UIColor(red: rgba.red // error here: "cannot assign to value: 'self' is immutable" 
      , green: rgba.green, blue: rgba.blue, alpha: newValue) 
     } 
    } 
} 

をが、エラーがあります:

cannot assign to value: 'self' is immutable

それはしかし、自己に割り当てる日の延長が

public extension Date { 

    public var day: Int { 
     get { 
      return Calendar.current.component(.day, from: self) 
     } 
     set { 
      let allowedRange = Calendar.current.range(of: .day, in: .month, for: self)! 
      guard allowedRange.contains(newValue) else { return } 

      let currentDay = Calendar.current.component(.day, from: self) 
      let daysToAdd = newValue - currentDay 
      if let date = Calendar.current.date(byAdding: .day, value: daysToAdd, to: self) { 
       self = date // This is OK 
      } 
     } 
    } 
} 

OKですので、のUIColorがあちこちにさですm NSObjectとDateはSwift構造体ですか?根本原因は何ですか?

答えて

1

あなたは日付が構造体(値型)で、UIColorクラス(参照型)であるため、それは正しいです。あなたは本当にただその構造のすべてのプロパティを更新している(簡単に言えば)ので、実際のメモリ位置が変更されない構造体のために自己に割り当て

。だからあなたは自分自身の価値を実際に変えているわけではありません。

は、しかし、あなたはあなたが自分に割り当てときに、あなたが自己を変異しようとしているメモリに全体新しいクラスを作成しているクラスに自己に割り当てるとき。たとえ許可されたとしても、元のクラスへの参照を保持しているので、どのように色を参照しているものがどのように扱いますか。

+0

あなたは、コードの溶液を投稿することができますか? –

+0

@Upholder残念ながら、私は拡張子を使用して解決策があるとは思いません。 'UIColor'のアルファ値を変更することなくアルファ値を変更することはできません。また、変更することはできません。 –

+0

ありがとうございます! – Phoenix19