Swift - Class
struct과 같이 청사진의 역할
속성, 메소드를 모두 가질 수 있음
* 상속 가능
class 클래스명: 부모클래스 { // 이와 같은 방법으로 부모클래스를 상속받을 수 있음
override func move() { // 부모클래스의 move 메소드를 수정하고자 할 때는 override 키워드 필요
super.move() // 부모 클래스의 move 메소드를 사용하고 싶을 때는 super 키워드로 접근
}
}
Class VS Struct
클래스는 상속 가능 + 더 복잡하고 오류가 나기 쉬운 구조
구조체는 상속 불가
구조체는 구조에 변동이 생길 때마다 구조체를 제거하고 수정된 새로운 구조체가 생성되는 식(Immutable)
사진을 전달한다고 할 때,
- 구조체는 passed by value
- 사진을 여러 장 복사해서 전달 / 누군가가 받은 사진을 훼손한다 해도 복사본을 받은 다른 사람에게는 영향 X
- 클래스는 passed by reference
- 사진이 위치한 주소 전달 / 누군가가 사진을 훼손하면 다른 사람들은 그 사진에 접근할 수 없게 됨.
- 따라서, 객체를 가리키는 변수가 여러 개 있을 수 있음.
Storyboard 없이 코드만으로 UI 구성하기

위와 같이 SecondViewController라는 swift 파일을 생성해서 같은 이름의 클래스를 구현

SecondViewController를 호출하여 새로운 뷰에 bmi 값을 출력

그러나 bmi 값을 출력하는 단순한 Label 하나를 출력하는데 저렇게나 많은 코드가 필요하다는 불편함이 있음!!
Segue(세그, 세그웨이)
스토리보드에서 뷰 컨트롤러 사이의 화면전환을 위해 사용하는 객체
방금 생성했던 SecondViewController swift 파일 삭제
CocoaTouch Class 파일 생성 - ResultViewController로 이름 지었음
화면을 제어하는 클래스 설정
새로운 화면 상단의 버튼 중 가장 왼쪽의 View Controller를 선택
우측의 Identity Inspector로 이동하여 적절한 Class를 선택 - ResultViewController

두 화면 연결
ctrl 키를 누른 채 첫번째 화면의 view controller 버튼을 누르고, 두번째 화면의 view controller에 드래그하면 Segue가 생성됨
여기서는 종류로 Present Modally를 선택했음
두 화면 간 전환 방식은 우측 Inspector에서 보이는 것처럼 선택할 수 있음
해당 Segue를 지칭하는 식별자 Identifier를 지정해주어야 함

새로 생성한 Controller의 템플릿 코드를 보면 다음과 같은 안내 사항이 있음
네비게이션 전에 약간의 준비가 필요할 수 있다.
새로운 뷰 컨트롤러를 segue.destination을 통해 접근하고, 선택한 객체를 전달하라.

→ 설명에 따라 bmiValue라는 값을 prepare 메소드 안에서 전달
segue.destination은 UIViewController 타입인데, 이 클래스에는 bmiValue라는 값이 존재하지 않음
UIViewController를 상속 받아서 ResultViewController 클래스를 생성했고, 이 클래스의 속성으로 bmiValue를 추가했음
따라서 bmiValue에 접근하기 위해서는 ResultViewController로 Down Casting이 필요!
Swift에서 Casting에는 as 키워드를 사용(이 경우의 Down Casting은 필히 성공하기 때문에 !를 끝에 붙였음)

이전 화면으로 돌아가기
간단하게 dismiss 메소드 하나로 이전 화면으로 돌아갈 수 있음

Debug View Hierarchy

앱이 실행 중인지 확인한 후, 하단의 네모가 쌓인 아이콘(라이언 발끝이 가리키는 곳)을 클릭하면 3D로 앱의 현재 상황을 볼 수 있음
Swift - 옵셔널(Optional) 사용 방법
- Force unwrapping
- 옵셔널 값을 강제로 unwrap
- 즉, Xcode에게 이건 nil이 절대 아니야!라고 단정짓는 것
- 그러나, 사실 그 값이 nil인 경우, 에러 발생 → 매우 조심해서 사용해야 하는 방법!
- Check for nil value
- if 문을 통해서 해당 옵셔널이 nil이 아닌지 검사한 후 나머지 코드를 실행
- ex) if myOpt != nil { let myVal = myOpt! }
- 코드가 길어지고, 결국 또 Force unwrap을 하게 되는 단점
- Optional Binding
let myOpt: String?
myOpt = "Panda"
if let safeOpt = myOpt { // myOpt가 값이 있으면 safeOpt에 할당하여 if문 진입
let animal = safeOpt
print(safeOpt)
} else { // myOpt가 nil이라면 else문 실행
print("my optional was found to be nil.")
}
- Nil Coalescing Operator
- 옵셔널의 디폴트 값을 넣고 싶을 때 필요
- 물음표 두개 ( ?? )로 표현
- 옵셔널이 nil이라면 ?? 뒤의 값이 디폴트값으로서 옵셔널 대신 할당됨
var myOpt: String?
myOpt = nil
var text: String = myOpt ?? "default value" // text에 "default value"가 할당됨
print(text)
- Optional Chaining
- 클래스 또는 구조체 자체가 옵셔널이라면?
- 물음표 한개( ? )로 클래스/구조체와 그것의 속성/메소드를 연결하여 표현
- optional?.property
- optional?.method()
- 만약 optional이 nil이라면 위 값은 nil
- optional이 nil이 아니라면 property와 method()에 접근 가능
ColorLiteral을 사용할 수 없는 현상
강의에서는 ColorLiteral을 사용하던데 안 돼서 찾아보니,
Xcode 13부터는 더이상 ColorLiteral을 사용할 수 없고, 대신 #colorLiteral() 을 사용한다고 한다.
#colorLiteral( 까지만 치고 엔터를 치면 사용 가능! 이라더니...

난 안 됨.. 아무것도 안 뜸..

다른 수강생들도 같은 문제가 있었는지 커뮤니티에 해결책이 있었다.
→ color를 모아놓은 튜플을 만들었고, 그 안에서 #colorLiteral( 하고 엔터치니까 되었다!

struct 안에서는 바로 사용할 수 없는 이유가 무엇인지는 모르겠다...
Assistant Editor에서 관련 파일이 뜨지 않는 경우
option 키를 누르고 좌측 Project Navigator에서 원하는 파일을 클릭!
출처: https://www.udemy.com/course/ios-13-app-development-bootcamp/
'프로그래밍 > iOS' 카테고리의 다른 글
| Udemy iOS 강의 - 섹션 15 (0) | 2023.08.22 |
|---|---|
| Udemy iOS 강의 - 섹션 13 (0) | 2023.08.02 |
| Udemy iOS 강의 - 섹션 9~10 (0) | 2023.07.18 |
| Udemy iOS 강의 - 섹션 7~8 (0) | 2023.07.17 |
| Udemy iOS 강의 - 섹션 6 (0) | 2023.07.08 |