4535
`UIColor` のカテゴリを作っている時に、そのメソッドの中で `self(UIColor型)` の `RGBA` を変更する必要が出ました。  
インスタンスを再生成せずに RGBA を変更する方法を教えてください。
CC BY-SA 3.0
2015-01-14T06:01:40.543
4530
2015-01-14T07:25:19.283
2015-01-14T06:57:41.870
76
7364
question
ios objective-c
生成したUIColorのRGBA要素を変更する方法
不可能です。

リファレンスには、以下の記述があるので明らかです。

> Color objects are immutable and so it is safe to use them from multiple
> threads in >your app.

<https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIColor_Class/index.html>

不変オブジェクトの、バグを引き起こしにくく、スレッド安全である性質から、  
iOS SDKのいくつかのクラスは、不変オブジェクトとして実装されています。

したがって今回のケース、カテゴリを作成するにあたっても、  
自身のデータを変更することなく、新しいUIColorを戻り値等で返す実装が推奨されます。
CC BY-SA 3.0
2015-01-14T07:00:33.860
4535
2015-01-14T07:22:17.003
2015-01-14T07:22:17.003
7368
7368
4530
answer
`UIColor` はイミュータブルなので、変更はできず、作り直すことになります。 典型的には以下のような形になるでしょう。

```

    CGFloat red, green, blue, alpha ;
    
    BOOL ok = [ myOldColor getRed:&red green:&green blue:&blue alpha:&alpha ];
    if ( !ok ) { 
      // 色空間が RGB ではないなどの理由で取得失敗
    }
    
    // HERE: red, gree, blue, alpha を変更する
    
    UIColor *myNewColor = [ UIColor colorWithRed:red green:green blue:blue alpha:alpha ];
    
```

参考: [UIKit Framework Reference > UIColor Class
Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIColor_Class/index.html)
CC BY-SA 3.0
2015-01-14T07:05:26.980
4536
2015-01-14T07:25:19.283
2015-01-14T07:25:19.283
4978
4978
4530
answer