-
200925 - TILTIL/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은 마지막 화면이다. 그런데 이 둘의 타입은 ViewController와 SecondViewController(내가 정의한 클래스: 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
가려진 비밀번호를 확인하기
코드는 매우 간단하지만 생각해 볼 게 많았다.
화면을 연결하면
- 비밀번호 확인 버튼을 누른다.
- 두 번째 화면이 메모리에 생성된다.
- prepare(for:sender:)메서드가 실행된다.
- 두 번째 화면(segue.destination)의 Outlet, Action이 연결된다.
- 화면이 전환된다.
이러한 순서로 연결이 되기 때문에
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
- 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