iOS

    iOS 주니어 개발자가 의존성 관리에 관심을 가지게 된 배경

    1. 의존성 관리에 관심을 가지게 된 계기 우리가 만든 UX/UI로 앱을 만들고 싶다는 상상 하나로 개발을 시작한 디자인 전공생이 벌써 3년차 iOS 개발자가 되었습니다. 그간 많은 것들을 보고 배웠지만 특히 이해가 잘 가지 않는 분야가 있었는데요. 바로 의존성 관리(의존성 주입, 역전)였습니다. 의존성 관리에 대해 어떤 계기로 관심을 가지게 되었는지 적어보고자 합니다. 작년까지만 해도 의존성 관리에 대해서는 굉장히 소홀했던 것 같습니다. 사실 의존성 관리에 대한 고민을 깊게 하지 않았고, 어떻게 풀어내야 할 지도 감이 오지 않았습니다. 그랬던 제가 의존성 관리에 관심을 가지게 된 계기는 모듈화와 TDD였습니다. 회사에서 테스트 코드를 작성하지 않고 일정에 치여 개발을 하다보니 사이드 이펙트와 이슈에서 ..

    [iOS] LayoutDriven UI

    1. LayoutDriven UI에 들어가기 앞서.. 우리는 iOS에서 UI를 그리거나 업데이트할 때 아래와 같은 이슈를 많이 겪으셨을 것 같아요. 아래의 문제가 모두 UI의 문제라고 볼 수는 없지만, 분명 로직에 따라 UI 업데이트를 요청했는데 반영되지 않는 것이 가장 큰 이슈 같습니다. 🆕 뱃지가 있는 UI를 눌렀는데 뱃지가 사라지지 않음 📩 메세지를 읽었는데 '읽음' 으로 상태가 바뀌지 않음 ✅ 버튼을 눌렀는데 Pressed 상태로 바뀌지 않음 ☠️ UI를 업데이트 하다가 메인쓰레드에서 동작하지 않아 앱이 죽음 이런 상황의 공통점은 로직에 따라 UI 업데이트가 되지 않음으로 볼 수 있습니다. 이러한 문제점은 대부분 UI를 업데이트하는 코드가 바깥에 따로 존재하기 때문이라고 생각합니다. UI를 작은 ..

    [Swift] 프로퍼티(Property)

    프로퍼티 접근자 메소드를 자동으로 생성하는 기술입니다. let으로 생성했을 경우에는 getter 기능만 제공하는 것이고, var로 생성했을 경우에는 getter, (optional) setter 두 가지 기능을 모두 제공하는 것입니다. Stored Property - 저장형 프로퍼티 단순히 값을 저장하고 있는 프로퍼티 Enum 에서 사용 불가능 Computed Property - 계산형 프로퍼티 var를 사용합니다. newValue로 setter에서 새로운 값을 사용할 수 있습니다. (변수명 지정도 가능합니다) 프로퍼티를 가장한 메소드입니다 간단한 메소드를 계산형 프로퍼티로 사용하면, 코드의 가독성에 도움이 됩니다. 메소드로 기능을 제공할 경우 struct Timer { let id: Int let st..

    [Swift] Enum2

    Enum없이 분기하고자 할때 이미지의 확장자별로 분기하고자 했는데 확장자가 늘 일정하지 않을 수 있습니다. "jpg"로 입력되었으면 했지만, "JPG", "JPEG", "jpeg" 등 다양하게 입력이 되는데 이 부분을 모두 분기 처리하기에는 굉장히 번거롭습니다. func getAvatarImageFilename(for fileExtension: String) -> String? { swtich { case "jpg": return "avatar.jpg" case "bmp": return "avatar.bmp" case "gif": return "avatar.gif" // 단일 실패의 처리는 optional default: return nil } } if let result = getAvatarImageF..

    [Swift] 상속

    Swift에 대해서 개인적으로 공부하고 기록한 포스팅입니다. 구조체를 활용한 상속? 중복된 속성이 존재할 때, 객체 지향 설계에서는 중복된 속성을 부모 클래스를 통해 캡슐화가 가능합니다. 스위프트에서 상속을 사용하기 위해서는 구조체가 아닌 클래스를 이용해야 합니다. (Call by Ref) 아래와 같이 상속을 위해서는 구조체를 활용할 수 없습니다. struct User { let email: String let password: String let joinDate: Date var level: Int var exp: Int } struct Admin { let email: String let password: String let joinDate: Date var logs: [String] } 클래스를 활..

    [Swift] Tuple

    Tuple(튜플) 다양한 값의 묶음 임시적으로 사용할 때는 유용하지만, 범용적으로 사용될 경우 구조체나 클래스를 이용해야 합니다. func foo() -> (Stirng, Int) { return("Tom", 42) } var result = foo() print("\(result.0) / \(result.1)") var (name, age) = foo() print("\(name) / \(age)") func foo2() -> (name: String, age: Int) { return (name: "Tom", age: 42) } var result2 = foo2() print("\(result2.name) / \(result2.age)") var (name2, age2) = foo2() print("..

    [Swift] Enum

    Struct를 활용해서 채팅 메세지를 만든다고 가정해보겠습니다. 채팅메세지에는 아래와 같은 형식을 가지고 있습니다. 일반적인 텍스트 메세지 채팅 참가 메세지 채팅 탈퇴 메세지 위와 같은 메세지 형태를 Struct로 표현했을 경우와 Enum으로 표현했을 경우에는 어떤 차이점이 있는지 확인해보겠습니다. 1. Struct struct Message { let userId: Int let contents: String? let data: Date let hasJoined: Bool let hasLeft: Bool } let joinMessage = Message(userId: 1, contents: nil, date: Date(), hasJoined: true, hasLeft: false) let textMes..

    [Swift] 문자열 (String)

    0. Siwft를 처음 공부하게 되면서 2020년 11월에 IOS앱 출시를 목표로 Swift 공부를 시작하게 되었다. 가장 첫 번째 포스트이기도 하고 "배운 것들을 그때그때 정리해야지!" 라고 항상 생각하긴했는데 이제서야 실천하게 된다. 아마 이 포스팅을 누군가 보고있다면 " 왜 첫 번째 포스팅이 문자열(String) 이지?" 라고 생각할 것 같다. 아무래도 첫 번째 언어가 C언어인 탓이 크다고 할 수 있겠다. C의 문자열 관리는 정말 어려웠던 기억이 생생하기 때문인데, strcpy strcmp따위를 사용하다가 C++ String 클래스의 operator+ operator==등을 사용하게 되면서 속에 꽉막힌 무언가가 내려가는 느낌을 아직도 잊을 수 없다. 그런 이유로 String 클래스부터 펼쳐본다. 1..

    [iOS] SnapKit 사용해보기

    ☁ SanpKit Download SnapKit/SnapKit A Swift Autolayout DSL for iOS & OS X. Contribute to SnapKit/SnapKit development by creating an account on GitHub. github.com 1. SnapKit을 접하게 된 계기 회사에서 기존 어플리케이션 리팩터링을 결정했다. 현재 어플리케이션은 Obj-C로 되어있기도 했고, 부분 부분만 Swift가 사용되면서 유지보수성이나 추가 기능을 제작할 때 많은 제약사항이 있었고, 이에 따라 퍼포먼스도 좋을 수가 없었다. 현재 환경을 고려해서 UI를 Storyboard를 채택할 것인지, SnapKit을 채택할 것인지 많은 논의가 오갔다. SnapKit을 채택하게 된 가..