ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 200925 - TIL
    TIL/2021 2020. 9. 26. 03:22

    Swift 문법

     

    오늘은 Property, Method, Inheritance에 대해서 공부했다.

     

    Property

    • Instance Property
    • Stored Property
    • Computed Property
    • Property Observer
    • Type Property
    • Lazy Property

     

    method

    • Instance Method
    • Type Method
    • mutating
    • self
    • Self
    • Subscript

     

    Inheritance

    • 상속을 하는 방법
    • Super Class
    • Sub Class
    • Upcasting
    • DownCasting
    • override
    • overloading
    • Type Casting
    • as와 is
    • Any와 AnyObject

    각각의 개념들은 여러 번 반복해서 보니 이해가 됐다. 이제 이 개념들을 잘 조합해서 하나로 합쳐지게 더 연습을 해봐야겠다.

     

     

     

    iOS

     

    • view controller 새로 만들어서 연결하는 방법
    • Cocoa, Cocoa touch가 무엇인지
    • prepare(for:sender:) 메서드
    • segue.source, segue.destination는 왜 업캐스팅 돼있을까?

     

    화면을 연결하는 방법이 코드는 간단하지만 속에 들어있는 개념은 간단하지 않았다.

     

    segue.source는 연결된 두 화면 중에 첫 화면이고  segue.destination은 마지막 화면이다. 그런데 이 둘의 타입은 ViewControllerSecondViewController(내가 정의한 클래스: UIViewController를 상속한다.)가 아닌 둘의 SuperClass인 UIViewController으로 업캐스팅 돼있다.

     

    왜 업캐스팅이 돼있을까?

     

    내가 생각한 이유는 다음과 같다.

    만약 업캐스팅 되지않고 타입을 그대로 따라간다고 가정해보자.

    화면이 두 개 있다면 문제가 되지 않는다. 그런데 화면이 하나 더 생겨서 세 번째 화면이 있다고 생각해보자.

     

    이렇게 되면 segue.destination은 어떤 타입일까? 첫 번째 Segue에서는 SecondViewController가 되어야 하고 두 번째 Segue에서는  ThirdViewController가 되어야 한다.

     

    둘은 UIViewController를 상속하지만 각각 다른 클래스이기 때문에 다른 멤버를 가지고 있다. 그렇게 되면 segue.destination.멤버로 접근할 때 어떻게 접근할지 모르게 된다. 또한 ThirdViewController를 UIViewController로 업캐스팅한 후 SecondViewController로 다운캐스팅을 할 수도 없으므로 segue.soure와 segue.destination은 타입을 그대로 사용하지 않는다.

     

    업캐스팅이 돼있다면 모든 segue.source와 .destiantion을 따로 표시하지 않아도 되고 내가 원하는 Segue에 직접 다운캐스팅하여 접근할 수 있게된다.

    segue.destination as? SecondViewController

     

     

     

    가려진 비밀번호를 확인하기

     

     

    처음 화면

     

    비밀번호를 입력하면 가려져있다. 확인을 누르면
    화면이 넘어가고 입력한 비밀번호를 보여준다.

    코드는 매우 간단하지만 생각해 볼 게 많았다.

    화면을 연결하면 

    1. 비밀번호 확인 버튼을 누른다.
    2. 두 번째 화면이 메모리에 생성된다.
    3. prepare(for:sender:)메서드가 실행된다.
    4. 두 번째 화면(segue.destination)의 Outlet, Action이 연결된다.
    5. 화면이 전환된다.

     이러한 순서로 연결이 되기 때문에 

    passwordShowLabel.text = passwordField.text

    와 같이 첫 번째 화면의 텍스트 필드 텍스트를 두 번째 화면의 레이블의 텍스트에 바로 넣는 방법이 불가능했다.

     

     

    그래서 두 번째 화면에서

    var value: String?
    

    프로퍼티를 생성하여 2번 순서에서 value가 생성되게 만들고

     

     

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            guard let vc = segue.destination as? SecondViewController else { return }
            vc.value = passwordField.text
        }

    다운 캐스팅을 한 후에 value 프로퍼티에 접근하여 여기에 첫 번째 화면의 텍스트 필드 텍스트를 저장했다.

     

     

        override func viewDidLoad() {
            passwordShowLabel.text = value
            super.viewDidLoad()
        }
        
        

    그리고 passwordShowLabel.text에 value 즉 첫 번째 화면의 텍스트 필드 텍스트를 저장시켰다.

     

     

     

    전체 코드이다.

    import UIKit
    
    class ViewController: UIViewController {
        
        @IBOutlet weak var passwordField: UITextField!
        
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            guard let vc = segue.destination as? SecondViewController else { return }
            vc.value = passwordField.text
        }
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
    
    }
    import UIKit
    
    class SecondViewController: UIViewController {
        
        var value: String?
    
        @IBOutlet weak var passwordShowLabel: UILabel!
        
        override func viewDidLoad() {
            passwordShowLabel.text = value
            super.viewDidLoad()
        }
        
    
    }

     

     

     

     

     

     

    테이블뷰의 값을 넘기기 - 실패

    > 를 누르면 해당 주소가 나오도록 만들었다.
    이렇게 나오게 만드려 했다.

    클래스로 Person을 선언하고 name과 address 속성을 만들고 배열을 만들어서 저장시키고 이름을 누르면 주소가 나오도록 만들었는데

    앱을 실행하고 이름을 누르면

    다음과 같은 에러가 나오며 크래쉬가 발생했다. 오류의 이유를 찾아봐야겠다.

    200928 추가 : 문제는 두 번째화면의 연결이 잘못연결됐었다. 두번째 화면의 Identity Inspector에서 클래스를 지운 후에 다시 입력하고 실행하니까 문제가 해결됐다. [각주:1]

    1. 200928 추가 [본문으로]
    728x90

    'TIL > 2021' 카테고리의 다른 글

    200928 - TIL  (0) 2020.09.29
    200926 - TIL  (0) 2020.09.27
    200923 - TIL  (0) 2020.09.24
    200921 - TIL  (0) 2020.09.22
    200920 - TIL  (1) 2020.09.21
Designed by Tistory.