티스토리 뷰

iOS

iOS ) frame.height VS frame.size.height

Zedd0202 2017. 10. 4. 19:07
반응형

안녕하세요 :) Zedd입니다.

오늘은 추석을 맞아..간단한...차이점을 알아볼거에요 :)

예전에 frame관련 글을 썼을 때 들었던 궁금증인데 지금에서야 쓰네요 ㅠ

이 글을 읽기전에!!

<CGRect CGSize 차이, 그리고 CGPoint >이 글을 읽고오시면(특히 CGRect!!!) 글을 이해하는데 도움이 많이 되실거에요 :) 


아무튼 궁금했던 frame.height와 frame.size.height의 차이점을 알아볼게요 :)




 frame.height  VS  frame.size.height



글은 height로 썼지만...width에도 적용이 되는 차이점이랍니다 :)

그냥 편의상 height로 말할게요XD..


프로젝트를 열고, View를 하나 추가해주고 IBOutlet를 연결해주었어요.



그러면, 


myView.frame.height

myView.frame.size.height

이렇게 높이와 관련된 프로퍼티에 접근이 가능하게 됩니다.


그리고, frame은 <Frame Bounds 차이 (1/2)>글에서 볼 수 있듯이 UIView의 인스턴스 프로퍼티로서, CGRect타입이었어요.

그리고  CGRect는 origin, size라는 변수를 가지는 구조체였어요.

struct CGRect {

    var origin: CGPoint

    var size: CGSize

}

extension CGRect {

    ...

    var width: CGFloat { get }

    var height: CGFloat { get }

    ...

}

이제 진짜 frame.height  VS  frame.size.height의 차이점을 알아봅시다. 


1. frame.height


frame.height는 바로..!!

extension CGRect {

    ...

    var width: CGFloat { get }

    var height: CGFloat { get }

    ...

}

이 CGRect를 extension한 곳에 있는 프로퍼티인, height를 의미하는 것입니다. 

frame이 CGRect타입이었으니, CGRect의 모든 프로퍼티에 바로 접근할 수 있겠죠? 

{ get }이라는 것이 눈에 띄네요.


2. frame.size.height

반면에 frame.size.height는...

struct CGRect {

    var origin: CGPoint

    var size: CGSize

}

저 CGRect구조체 안에 있는 size에 먼저 접근한다음,


public struct CGSize {

    public var width: CGFloat

    public var height: CGFloat

    public init()

    public init(width: CGFloat, height: CGFloat)

}

size가 CGSize형이었으므로, CGSize안에 있는 저 height라는 프로퍼티에 접근하게 되는것이죠.




자, 이제 둘의 차이점을 봅시다. 

extension CGRect {

    ...

    var width: CGFloat { get }

    var height: CGFloat { get }

    ...

}


public struct CGSize {

    public var width: CGFloat

    public var height: CGFloat

    public init()

    public init(width: CGFloat, height: CGFloat)

}

둘다 CGFloat이긴한데..차이점이 있다면, public과 { get }의 유무겠네요.

public은 음..오늘의 차이점에서는 별다른 역할을 하지 못하니 생각하지 않을게요.


frame.height와  frame.size.height의 차이점은 바로 저 { get }에서 오는데요,

{ get }에 대한 거는 나중에 따로 글을 쓸텐데, 지금 간단하게 말씀드리면

c++이나 JAVA의 getter아시죠? 그것과 상당히 유사합니다. 


getter는 setter와 다르게 값을 set하지 않고, 값을 리턴해주는 역할을 하죠? 

Swift도 똑같습니다!!

그러니까, { get }이라고 적힌거는 값을 리턴하는 역할을 하는것이죠.

({ get }이 있다면, { set }도 있겠죠? 정확히는 { set }하나만을 구현할 수는 없고, { set }을 구현하려면 { get }도 있어야해요. 하지{ get }만을 구현하는것은 가능하답니다. 이건 나중에 볼게요 XD)



아!! 그럼 frame.height와  frame.size.height는


frame.height  -> {get}

frame.size.height 


이라는 차이점이 있네요. 

즉!!!!!!!!!!!!!

myView.frame.height = 10//error!!!! frame.height는 get이므로.

myView.frame.size.height = 10//가능

이라는것이죠. 

역시 width에도 똑같이 적용이 됩니다. 



어떠신가요 ㅎㅎ 

추석을 맞아 이러한 차이점을 알아보았습니다 :)

즐거운 명절되세요XD

오늘도 도움이 되었길 바래요💕



반응형

'iOS' 카테고리의 다른 글

iOS ) alert에 TextField추가하는 법  (5) 2017.10.10
iOS ) CGColor와 UIColor의 차이  (3) 2017.10.05
iOS ) TableView cell의 separator padding 문제  (3) 2017.09.28
iOS ) Frame과 Bounds의 차이 (2/2)  (2) 2017.09.21
iOS 11 달라진 점!!  (2) 2017.09.20