첫번쨰로 공유드릴 내용은 영상필터링을 위한 구조체입니다. -> 숏클립에 등록되는 영상들에 대한 필터링(5초 미만 120초 이상은 못올림 등)을 관리하는 구조체인데요. 여기서 함수를 어떻게 사용하는지, 반복문, 조건문이 어떻게 사용되는지를 공유드리겠습니다. -> 화면공유로 코드 공유
각 상황에 따라서 노출되는 뷰 타이틀이 다를 경우 -> 내용만 다르고 구성이 공통적이라면 우선 enum으로 구현한 후 이런식으로 구현했습니다.
let filterTitle: String? = {
switch filterType {
case .createType:
return viewModel.createdType?.description
case .statusType:
return viewModel.statusType?.description
case .exposeType:
return viewModel.exposeTypes?.description
}
}()
* 구조체와 클래스의 차이를 인지하고 있다.
* 예) value type, reference type
* 예) shallow copy, deep copy
구조체와 클래스 차이는 모두 다 알다시피 구조체는 value타입이며 클래스는 reference 타입입니다.
이는 인스턴스가 할당될 때 실제 값이 할당되느냐 그 값을 참조하는 메모리주소값이 할당되느냐 차이입니다.
그 이외 복사가 되느냐 공유가되느냐, 상속과 타입캐스팅은 지원하느냐(클래스만 지원), 생성자를 가질 수 있냐 없냐(클래스는 생성자와 소멸자 가질 수 있음) 등에 차이가 있지만 세부적으로 들어가진 않을 예정입니다.
* inheritance와 extension 등 기능을 확장하는 방법의 용도와 차이를 숙지하고 있다.
해당내용도 많이 쓰이기 때문에 어떻게 사용되는지 정도만 공유하겠습니다.
extension은 보통 특정 클래스에 코드가 너무 길어질 경우, 또는 변수 함수 등 각 상황에 맞게 코드를 분리하고 싶을떄 사용할 수도 있고, 특정 프로토콜을 채택할경우 그 프로토콜에 대한 정의가 필요할경우 사용할 수 있습니다.
한가지 특이점이라면 extension 에선 stored property를 사용할 수 없습니다. 이렇게 된다면 다른곳에서 extension을 통해 공통값에 대한 캐스팅을 변경시켜서 오류가 발생할 수 있다 라고 들었던 것 같은데요.
AssociatedObject를 사용해서 get set을 통해 설정할 순 있지만 번거로우니 computed Property로 선언하는게 제일 편하긴 합니다. (예시 : private class var userAgentField: String { return "User-Agent" }
extension은 기본적으로 스위프트에서 제공하는 UIApplication이나 String 등과 같은 객체들도 extension을 사용해서 커스텀해서 사용할 수 있습니다. -> UIApplication사용하는거 보여드림
* designate initializer와 convenience initializer의 차이를 안다.
designate init은 그냥 평범하게 사용되는 init -> 굳이 명시 안해도 자동으로 만들어줌
convenience initializer -> init시 필요한 내용을 상황에 따라서 핸들링할 수 있음. -> 받아오는 파라미터에 따라 여러개 갈래로 만들어주는것 -> 그리고 거기서 핸들링해서 기존 init으로 넘겨주는 형태 -> 물론 init으로 받아오는 파라미터가 고정이며, 없을 경우는 = nil 뭐 이런식으로 명시하면 되지만 요런 케이스에선 필요할 수 있다.
init(urlRequest: URLRequest) -> 이렇게 구현되있는데 실 사용에선 해당 클래스로 urlString: String 이걸 보낼수도 있고, url: URL 이런식으로 보낼수도 있다. -> 물론 그 클래스를 선언하는쪽에서 핸들링해서 보낼수도 있지만 공통클래스인경우 convenience를 사용해주면 좀 더 사용이 간편해질 수 있다. -> CustomInappBrowser참조
* protocol과 generic 등을 이용한 기능 확장과 코드 재사용의 개념을 이해하고 있다.
예) Abstraction, delegation, template method
해당 영역은 다들 많이 사용하고 있을 것이기에 세부적인 의미는 다루지 않음
다만, 사용방식이 다를 수 있고 좀 더 참신한 방법도 있을 수 있기에 스튜디오앱에서 다루는 방식 공유
BaseViewController -> 아마 다들 이렇게 관리하고 계시긴 할듯 -> 특정 베이스 뷰컨을 상속받게되면 해당 뷰컨이 만들어질때마다 로깅되도록 구현하거나, statusStyle을 설정하거나 배경색을 고정하거나 하는 등 공통으로 사용되는 내용을 구현할 수 있다.
어떤 화면에서 동작하는 기능들에 대해서 공통 Manager로 묶어서 개발할수도 있다. -> 그때 상태값에 따라서 각 화면들이 동작하는걸 공통적으로 구현하고 싶을때 우린 다음처럼 구현합니다.
구현공유
1. 실시간 카메라 화면 받아오기
// AVCaptureSession 설정
guard let captureDevice = AVCaptureDevice.default(for: .video),
let input = try? AVCaptureDeviceInput(device: captureDevice) else {
return
}
captureSession.addInput(input)
DispatchQueue.global().async {
self.captureSession.startRunning()
DispatchQueue.main.async { [weak self] in
guard let self else { return }
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
}
}
swift
* 함수, 반복문, 조건문 등의 기본 문법을 숙지했다.
* 구조체와 클래스의 차이를 인지하고 있다.
* inheritance와 extension 등 기능을 확장하는 방법의 용도와 차이를 숙지하고 있다.
private class var userAgentField: String { return "User-Agent"
}* designate initializer와 convenience initializer의 차이를 안다.
* protocol과 generic 등을 이용한 기능 확장과 코드 재사용의 개념을 이해하고 있다.
예) Abstraction, delegation, template method
구현공유
1. 실시간 카메라 화면 받아오기
2. url로 추출된 영상 추출 및 저장