⭐️ 개발/iOS & Swift

⭐️ 개발/iOS & Swift

    [iOS/Swift] Custom Framework를 만들면서 배우는 접근제한자

    [iOS/Swift] Custom Framework를 만들면서 배우는 접근제한자

    순서 이 글에는 2가지 내용이 들어있다. 모듈에 대한 내용과 접근제한자에 대한 내용 1. 모듈화와 프레임워크 2. 접근제한자 3. open과 public의 차이 4. fileprivate과 private의 차이 5. Custom Framework 생성하기 6. Custom Framework 프로젝트에 추가하기 7. Custom Framework를 통해 접근제한자 알아보기 모듈화, 그리고 프레임워크 모듈화 : 앱에서 공통적으로 사용하는 UI 또는 기능이 있을텐데, 각각 수행하는 일에 따라 모아서 기능별로 하나로 모아놓은 것을 말하고, 앱을 모듈화할 시에 빌드 속도를 줄이고, 협업 시에 좋은 환경, 각 기능 별 의존성을 명확하게 지정할 수 있고, 기능 간 결합도를 낮춰서 유연한 서비스를 제작할 수 있다고 한..

    [iOS] UIPageViewController

    [iOS] UIPageViewController

    UIPageViewController 페이지 뷰 컨트롤러는 제스처를 사용하여 직접 제어할 수 있고, 페이지 간에 이동할 때 사용자가 지정한 전환을 사용하여 변경사항을 애니메이션화할 수 있다. UIPageViewController를 만들기 위해서 스보에 총 4개의 뷰컨을 올려줬다. 첫 뷰컨은 UIPageViewController를 상속시켜주고, 나머지 3개는 UIViewController 클래스로 만들어준다. 1. 페이지뷰컨은 여러개의 뷰컨을 담고 있기 때문에 뷰컨트롤러 배열 타입의 프로퍼티를 하나 선언해준다. var pageViewControllerList: [UIViewController] = [] 2. 뷰컨 배열에 뷰컨을 담아준다. private func createPageViewController(..

    [iOS] pngData(), jpegData(compressionQuality:)

    [iOS] pngData(), jpegData(compressionQuality:)

    Content-Type은 내가 보낼 데이터의 타입에 대한 정보를 담고 있다. multipart/form-data는 서버에 이미지 파일을 업로드할 때 Content-Type에 명시하는 것이다. 우리는 이미지, 파일, PDF를 그 자체로 서버한테 전송할 수 없다. 서버가 이해할 수 있는 텍스트 파일 또는 바이너리(0101010001....) 형태로 바꿔서 전송해야 한다. Alamofire 리드미를 보면 Multipart Form Data를 업로드하는 과정에서 append 하는 데이터의 타입이 Data인 것을 확인할 수 있다. 따라서, 우리는 해당 이미지 파일을 타입에 맞게 변환하는 과정이 필요하다. 이미지 파일을 변환해주는 메소드는 pngData() Returns a data object that conta..

    [iOS] cell에 delegate, datasource 코드를 작성하지 않는 이유... 어쩌구...저쩌구...

    [iOS] cell에 delegate, datasource 코드를 작성하지 않는 이유... 어쩌구...저쩌구...

    왜 MainTableViewCell에 있는 contentCollectionView의 UICollectionViewDelegate, UICollectionViewDataSource 프로토콜을 왜 cell에서 작성해주지 않고 ViewController의 cell에서 불러와서 작성해주는 걸까? 라는 김태끼의 질문에 나도 같이 얹혀서 ... ㅋㅋ 또한, MVC 관점에서 로직이 처리되어야 하고 모델과 뷰 사이에서 중개하는 게 컨트롤러의 역할인데, tableview datasource, delegate는 컨트롤러의 영역이다. Cell은 UI를 그리는 영역으로 View에 속하기 때문에 해당 코드가 ViewController에 있어야 하는 것도 맞는 부분이다.

    [iOS] UIImagePickerController

    [iOS] UIImagePickerController

    UIImagePickerController (Class) A view controller that manages the system interfaces for taking pictures, recording movies, and choosing items from the user's media library. 사용자의 미디어 라이브러리에서 사진 촬영, 동영상 녹화 및 항목 선택을 위한 시스템 인터페이스를 관리하는 보기 컨트롤러입니다. 즉, 사진 촬영, 동영상 녹화, 갤러리 선택과 관련된 걸 관리하는 컨트롤러이다. 여기보면 UIImagePickerController는 UINavigatoinController를 상속하고 있다. 또한, UIImagePickerController는 AVFoundation에 속하..

    [iOS] 간만에 코드 자랑하기

    [iOS] 간만에 코드 자랑하기

    응 구라였음... 그렇다. 콜백지옥이다. 이것은.. 컴플리션 핸들러,,,, 그러니까 비동기 처리를 위해서 @escaping closure를 썼더니 발생한 문제점이다. 내 손으로 직접 이 코드를 작성해보다니, 감격스러워서 기록으로 남겨본다. 아마 분명 조만간 이 코드를 개선하는 수업을 듣겠지? 너무 기대된다. 어서 빨리 async, await을 배워서 적용해보고 싶다... 귀여운 내 뷰...

    [iOS] xib 사용해서 재사용 가능한 Custom View 만들기

    [iOS] xib 사용해서 재사용 가능한 Custom View 만들기

    View를 선택해 xib 파일을 만들어준다. 그 다음 두 번째로 Cocoa Touch Class를 선택해 해당 파일의 실제 UIView 클래스 파일을 만들어 준다. 나는 PosterView라고 이름을 지어줬다. 다음으로, xib 파일과 클래스 파일을 연결시켜주는 단계다. 두 가지 방법이 있다. Custom Class를 바꿀 건지, File's Owner를 바꿀 건지. 후자를 선택할 거다. 이유는 활용도가 더 높기 때문! 인스펙터 영역에서 5번째 부분을 보면 File's Owner가 있다. 해당 영역에서 PosterView를 찾아서 입력해준다. 아래 사진처럼 왼쪽 부분 Placeholders -> File's Owner를 먼저 선택하면 보일 거다. 근데 이조차도 보이지 않는다면,, Document outl..

    [Swift] required init?(coder: NSCoder)

    [Swift] required init?(coder: NSCoder)

    required init?(coder: NSCoder) xib에서는 xml 형태로 인터페이스 빌더 구성 정보를 가지고 있다. Xcode의 인터페이스 빌더에서 구성한 값들은 모두 .xib 파일로 저장이 되는데 .xib는 컴파일러가 이해할 수 없기 때문에 스토리보드나 xib 파일을 읽기 위해서 컴파일 시에 이해할 수 있는 형식인 nib으로 변환이 되는 것이다. (+ 그래서 UINib(nibName: "name", bundle: nil)을 통해 파일의 컨텐츠를 메모리에 캐시하고 있다가 초기화 시점에 Unarchiving을 하고 사용자의 씬에 보여주는 것이다. 여기서 Unarchiving은 xib 모델 객체를 저장하기 위해서, 객체의 프로퍼티를 기록하고 파일 시스템에 저장하는 작업을 archiving이라고 하는..

    [iOS] Swift Attribute 중 @IBInspectable과 @IBDesignable

    [iOS] Swift Attribute 중 @IBInspectable과 @IBDesignable

    @IBInspectable는 인터페이스 빌더의 인스펙터 영역에 보여주는 역할을 함 @IBInspectable var cornerRadius: CGFloat { get { return layer.cornerRadius } set { layer.cornerRadius = newValue } } 타입을 무한정으로 제공해주는 것은 아님. CGColor를 제공하지 않음 그리고 해당 코드는 컴파일 시에 바로 반영이 되지 않는다. @IBInspectable이 담당하는 것이 아니라 @IBDesignable이 담당하는 것이기 때문에 컴파일 시점에 확인하려면 이걸 사용하면 된다. @IBDesignable class SeSACButton: UIButton { // 스토리보드 상에서 인스펙터 영역에서 사용할 수 있음 @IBI..

    [iOS] 동기, 비동기 시작하기 앞서 그냥 오늘 배운 거...

    [iOS] 동기, 비동기 시작하기 앞서 그냥 오늘 배운 거...

    어떤 용량이 대빵 큰 이미지를 다운 받는 실험을 해보자.. 그러면 다운을 받아오기까지 그 외의 작업은 아예 못하는 것을 볼 수 있다. 토글 버튼을 움직이는 거나 등등 아무 것도 할 수 없다. 그러면 global 큐에 넣어서 비동기로 동시에 작업을 해줬을 경우에 어떤지 한 번 확인해보자! 사진을 받아오는 동안에 다른 작업이 가능하다! 그러나 사진을 받아오는 도중에 코드 상에서 보라색으로 경고창이 하나 뜬다. UIImageView.image must be used from main thread only 이미지는 메인스레드에서 사용되어야 한다. 그래서 이 말을 따라서 이미지뷰를 넣어주는 작업을 메인 스레드에서 처리해줬다. 그랬더니 오류가 생기지 않았다. 애플에서는 자체적으로 UI 작업은 메인스레드에서 처리를 ..

    [Swift] 강순참이 존재하게 된 이유...

    내부함수를 반환하는 외부함수를 만들 수 있다. 그 경우에 외부함수의 생명주기가 끝나도 내부함수의 생명주기는 끝나지 않는다. 그 이유는 은닉성 때문인데 그래서 내부 함수는 살아남아 내부 함수 주변의 지역 변수나 상수도 함께 살아남아 있다. 그래서 외부함수는 메모리에서 내려왔지만 내부함수의 그 아이들은 메모리에서 내려오지 않고 떠돌아다니며 자리를 차지해 잡아먹는다. 그놈들을 값이 캡처되었다고 말하고 캡처리스트라고 하는데. 클로저에 의해 그렇게 발생하는 것이고, 그런 이유에서 순환참조가 발생하는 것이었다. 충격! 신기해서 기록한다...

    [Swift] 일급 객체, Closure (1)

    [Swift] 일급 객체, Closure (1)

    *스위프트의 특징 1. 객체지향, 2. 프로토콜 지향 3. 함수형 프로그래밍 First Class Object를 함수가 가지고 있기 때문 스위프트에서 함수는 일급 객체의 특성을 가지고 있음 왜 일급 객체일까? 그 유래를 보면, 영국 크리스토퍼 컴퓨터 과학자가 낸 개념인데. 영국에는 일급 시민이라는 계급이 있었다. 함수가 어느 정도의 기능까지 할 수 있냐에 따라서 일급, 이급, 삼급으로 나눈 것이고 일급 객체만이 지금까지 남은 것이고 일급 객체 함수는 역할을 많이 하고 특이한 아이라는 점에서 그 특징이 크게 3가지가 있다. 일급 객체의 특징 1. 변수나 상수에 함수를 넣을 수 있다. func checkBankInformation(bank: String) -> Bool { let bankArray = ["우..

    [iOS] Alamofire, SwiftyJSON을 사용해서 HTTP 통신하기

    [iOS] Alamofire, SwiftyJSON을 사용해서 HTTP 통신하기

    SwiftyJSON과 Alamofire을 사용해서 Naver 번역 OPEN API를 가져와서 구현할 것임 SwiftyJSON은 Alamofire와 함께 쓸 수 있는데 HTTP 통신할 수 있게 도와주는 라이브러리로 유명하다. 어떻게 사용하는지 예시코드를 그대로 가져가서 사용하면 된다. Alamofire 5부터 AF가 사용되는 점, AF는 Session.default를 참조하는 것. func requestTranslatedData(text: String) { // URL에 다 담는 것이 아님 let url = EndPoint.translateURL // Header : 메타정보 // Body : 실질적인 데이터 // Naver 개발 가이드에서 제공하는 걸 보고 따라하자 let parameter = ["sou..

    [Swift] Singleton Pattern

    [Swift] Singleton Pattern

    enum에서는 타입 프로퍼티만 사용할 수 있다. 초기화 자체가 안되기 때문에 저장 프로퍼티는 사용할 수 없다. struct에서는 초기화가 가능하다. 그래서 인스턴스 생성을 못하게 하기 위해서 접근 제한자를 초기화 구문 앞에 붙여서 막는 방법을 사용한다. struct StoryboardNames { // 접근제어를 통해 초기화를 막을 수 있음 private init() { } static let main = "Main" static let search = "Search" static let setting = "Setting" } 그러면 enum에서는 타입 프로퍼티 말고 case를 쓰면 안될까? 움,, 아무래도 case를 쓸 경우에는 rawValue를 중복해서 써줄 수 없다는 불편함이 있다. Singleto..

    [Swift] ReusableViewProtocol로 뷰컨/셀 식별자 사용하기

    [Swift] ReusableViewProtocol로 뷰컨/셀 식별자 사용하기

    기존에 tableViewCell이나 collectionViewCell의 reuseIdentifier를 사용하기 위해서는 문자열을 통해 접근해야 했다. 그렇다보니 발생하는 문제점은 휴먼에러.. 그니까 오타..!로 인해 찾지 못한다는 점 1. 타입 프로퍼티 각 클래스 파일에 작성하기 각 클래스마다 타입 프로퍼티를 만들어서 초기에 인스턴스를 생성해서 접근했다. 매번 클래스 만들 때마다 작성해줘야 하는 것과 각 클래스 파일에 들어가서 하나하나 체크해줘야 하는 게 번거롭다. 2. Constant 구조체 내에 모든 클래스의 타입 프로퍼티 모아두기 두 번째 방법으로는 Constant라는 구조체 파일에 모든 클래스의 타입 프로퍼티를 작성해서 접근하는 방식으로 만들어줬다. 이 방식의 장점은 모든 클래스들의 identif..