CGRectの上手な書き方


Swiftにおいて、CGRectを変更する場合は

[code]

    let view = UIView()
    view.frame = CGRect(x:0.0, y:100.0, width:200.0, height:200.0)
    //widthを変更したい
    view.frame = CGRect(x:0.0, y:100.0, width:300.0, height:200.0)
    
[/code]

と、このようにwidthだけ変更したい場合でもCGRectの長い文をツラツラ書いています。

このようにCGRectを一箇所だけ変更したい場合において、何か上手な書き方ってありますか？

また、どういったメリット、デメリットがあって

[code]

    view.frame.width = 300.0
    
[/code]

という書き方ができないように、CGRectのプロパティがreadonlyにしてあるのかも  
教えていただけると参考になります。




`CGRect`という構造体に対する誤解があるように見えます。構造体`CGRect`はそもそもなにかを調べることから始めましょう。  
Xcodeの索引能力は強力です。それを使わない手はありません。Xcodeのエディタに`CGRect`と入力します。その上にマウスカーソルを当て、Optionキーを押しながらクリックすると、ミニリファレンスが現れます。（下図）  
[![画像の説明をここに入力](https://i.stack.imgur.com/lxcBq.png)](https://i.stack.imgur.com/lxcBq.png)

ミニリファレンスの一番下の行「Reference」をクリックすると、フルリファレンスが開きます。そこには、`CGRect`の定義が書かれています。

[code]

    struct CGRect {
        var origin: CGPoint
        var size: CGSize
    
        init()
        init(origin origin: CGPoint, size size: CGSize)
    }
    
[/code]

`CGRect`は、`CGPoint`と`CGSize`をメンバーとする構造体であることがわかります。  
質問者さんの予想と違っていたのではありませんか？質問者さんは、このように予想していらっしゃったのでは？

[code]

    struct CGRect {
        var x: CGFloat
        var y: CGFloat
        var width: CGFloat
        var height: CGFloat
    }
    
[/code]

予想どおりなら、`view.frame.width =
300.0`という書き方ができるはずですが、予想どおりではないので、そうは書けません。`width`は`CGRect`のメンバーではないんですね。けっして、`CGRect`のプロパティ（メンバー）がRead
Onlyだからではありません。  
`width`は`CGSize`のメンバーです。

[code]

    view.frame.size.width = 300.0
    
[/code]

これなら書けます。  
「いちいち`size`を書くのはめんどう」と思われるかもしれません。その場合は、`CGRect`を拡張してあげましょう。

[code]

    extension CGRect {
        var width: CGFloat {
            get {
                return self.size.width
            }
            set {
                self.size.width = newValue
            }
        }
    }
    
[/code]

こう拡張すると、`view.frame.width = 300.0`が可能になります。




`CGRect`という構造体に対する誤解があるように見えます。構造体`CGRect`はそもそもなにかを調べることから始めましょう。  
Xcodeの索引能力は強力です。それを使わない手はありません。Xcodeのエディタに`CGRect`と入力します。その上にマウスカーソルを当て、Optionキーを押しながらクリックすると、ミニリファレンスが現れます。（下図）  
[![画像の説明をここに入力](https://i.stack.imgur.com/lxcBq.png)](https://i.stack.imgur.com/lxcBq.png)

ミニリファレンスの一番下の行「Reference」をクリックすると、フルリファレンスが開きます。そこには、`CGRect`の定義が書かれています。

[code]

    struct CGRect {
        var origin: CGPoint
        var size: CGSize
    
        init()
        init(origin origin: CGPoint, size size: CGSize)
    }
    
[/code]

`CGRect`は、`CGPoint`と`CGSize`をメンバーとする構造体であることがわかります。  
質問者さんの予想と違っていたのではありませんか？質問者さんは、このように予想していらっしゃったのでは？

[code]

    struct CGRect {
        var x: CGFloat
        var y: CGFloat
        var width: CGFloat
        var height: CGFloat
    }
    
[/code]

予想どおりなら、`view.frame.width =
300.0`という書き方ができるはずですが、予想どおりではないので、そうは書けません。`width`は`CGRect`のメンバーではないんですね。けっして、`CGRect`のプロパティ（メンバー）がRead
Onlyだからではありません。  
`width`は`CGSize`のメンバーです。

[code]

    view.frame.size.width = 300.0
    
[/code]

これなら書けます。  
「いちいち`size`を書くのはめんどう」と思われるかもしれません。その場合は、`CGRect`を拡張してあげましょう。

[code]

    extension CGRect {
        var width: CGFloat {
            get {
                return self.size.width
            }
            set {
                self.size.width = newValue
            }
        }
    }
    
[/code]

こう拡張すると、`view.frame.width = 300.0`が可能になります。

