분류 전체보기

    디모다모 앱스토어 리젝 대응기

    홍익대학교 디지털미디어디자인 졸업작품으로 어플리케이션을 개발하고 있습니다. 12월 18일 온라인 졸업전시 기간에 맞추어 어플리케이션 1차 런칭을 준비하고 있는데, 어플리케이션의 상태(?)를 점검하고자 테스트 릴리즈를 앱스토어 심사에 맡겨보았습니다. 약 3달 동안 어플리케이션의 기조를 잡는데 집중했다면, 지금은 실제로 출시가 가능한 상황인지 점검하고자 했습니다. 애플이 과연 어떤 답을 줄지도 굉장히 걱정되기도 했습니다. 아무래도 상용화를 목적으로 하는 첫 번째 어플리케이션이기도 했고, 관련 경험이 전무했기 때문일지도 모르겠습니다. 앱스토어 첫 번째 심사를 진행하면서 겪었던 리젝 사유 대응에 대해서 포스팅하고자 합니다. 앱스토어 심사 기간 앱스토어 심사 기간에는 24시간 또는 48시간 이내에 모든 심사가 진..

    [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을 채택하게 된 가..

    문자열 뒤집기 - [LeetCode.344]

    LeetCode.344 문자열을 뒤집는 함수를 작성하라. 입력값은 문자열이며, 리턴 없이 리스트 내부를 직접 조작하라. ✊ 꼭 체크하고 넘어가야 할 제약사항 입력값은 문자열이다. 리턴 없이 문자열을 직접 조작해야 한다. [풀이 1] 투 포인터를 이용한 스왑 ❓ 투 포인터란? 2개의 포인터를 이용해 범위를 조정해가며 풀이하는 방식 def reverseString(self, s: List[str]) -> None: left, right = 0, len(s) = -1 while left < right: s[left], s[right] = s[right], s[left] left += 1 right += 1 [풀이 2] 파이썬다운 방식 입력값이 리스트로 주어진다면 아래와 같이 reverse()함수를 통해 쉽게 ..

    Palindrome - [LeetCode.125]

    LeetCode.125 주어진 문자열이 팰린드롬인지 확인하라. 대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 한다. 팰린드롬의 정의 앞뒤가 똑같은 단어나 문장으로, 뒤집어도 같은 말이 되는 단어 또는 문장을 팰린드롬(Palindrome)이라고 한다. [풀이 1] 리스트로 변환 대소문자 여부를 구분하지 않고, 영문자 숫자만을 대상으로 한다. strs = [] for char in s: if char.isalnum(): strs.append(char.lower()) isAlnum()은 영문자 숫자 여부를 판별하는 함수. 대소문자를 구분하지 않으므로 lower()로 모두 소문자로 변환한다. while len(strs) > 1: if strs.pop(0) != strs.pop(): return Fals..