Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

주니곰의 괴발노트

SeSAC TIL - 22.07.14 본문

기타

SeSAC TIL - 22.07.14

Jhe2 2022. 7. 18. 03:29

1. 오늘 배운 내용

  • 오픈소스 라이브러리에 접근하고 사용하는 방법에 대해 배웠습니다.
  • 구현하는데 오래 걸리는 기능들을 단순히 불러오니, 바로 실행이 되어 신기하고 흥미로웠습니다.
  • UI관련된 라이브러리 위주로 사용하였는데 기회가 된다면 기능위주의 라이브러리도 사용해보고 싶었습니다.

2. Checklist

2-1. Storyboard Reference

한 스토리보드에 여러 화면을 놓고 작업을 하다보면 분명 헷갈릴 수 있다고 생각합니다. 이럴 때 활용하는 것이 스토리보드를 분리하여 사용하는 것입니다. 스토리보드 파일은 여러 개를 생성할 수 있고, 각 스토리보드를 세그웨이 및 기타 기능을 통해 연결해줄 수도 있습니다. 


2-2. Opensource License

오픈소스 라이브러리는 개발자들이 직접 구현해놓은 소스를 받아 설치만 하면 그 기능을 사용할 수 있는 라이브러리를 의미합니다. 종류가 굉장히 다양하고 카카X, 나 네이X 등 대기업에서도 사용하는 라이브러리가 있을 정도이며, 적절하게 사용했을 때는 앱을 만드는 시간에 들이는 시간을 최소로 하여 개발할 수 있습니다. 다만 저작권 상의 문제가 있을 수 있기 때문에 항상 이용할 때는 주의가 필요할 것 같습니다.


2-3. Swift Package Manager

오픈소스 라이브러리는 설치할 때 다양한 방법이 있지만, 그 중에서도 SPM(Swift Pakage Manager)는 Xcode 자체에 있는 기능으로 Swift 3.0 이상에서 생겼으며 현재는 가장많이 사용되고 있는 방법 중의 하나입니다. Xcode 자체에서 바로 설치할 수 있으며 한 번 설치해두면 기록이 남아있기 때문에 다른 프로젝트에서도 빠르게 설치할 수 있다는 점이 장점입니다. 


2-4. Major / Minor / Patch

버전을 표기하는 데는 다양한 방법이 있지만 주로 5.4.1이라는 형태로 표현을 합니다. 가장 앞의 5는 Major version을 의미하며 어떤 API의 큰 변화가 되는 업데이트가 진행되었을 때를 의미합니다. 중간의 4는 Minor version이며 기능의 추가나 그외 Major version보다는 변화가 크지 않을 때를 의미합니다. 마지막 숫자인 1은 patch version을 의미하며 버그의 수정과 같이 소소한 변화가 생겼을 때를 의미합니다.


2-5. Class Vs Struct

  Class Struct
Inheritance 가능 불가능
Override Override라는 키워드로 메서드 변경 가능 mutating이라는 키워드로 메서드 변경해서 사용 가능
Instance 인스턴스를 생성할 경우 참조 타입으로 해당 데이터가 저장되어 있는 주소를 가리킴. 인스턴스를 생성할 경우 값 타입으로 인스턴스주소에 데이터가 저장됨.
Initalizer 기본적인 생성자 이외에도 편의 생성자라는 것이 존재함. 클래스와 마찬가지로 생성자 생성 가능
Default Initializer 속성에 기본값을 주지 않으면 에러가 발생하며
기본값을 줬을 경우 기본 인스턴스 생성 가능
구조체는 속성에 기본값을 할당하지 않아도 에러가 발생하지 않음. 이 경우, 멤버와이즈 이니셜라이즈가 제공됨.
Memberwise Initializer 클래스에는 멤버와이즈 이니셜라이저가 제공되지 않음. 속성에 기본값을 아무것도 할당하지 않았을 때만 제공되는 생성자

2-6. Any Vs AnyObject

Any - 함수타입을 포함하여 모든 파입의 인스턴스를 대체할 수 있는 타입입니다. AnyObject와 비슷하게 구현되어 있다고 생각합니다. 하지만 Any 타입을 사용해야 할 때는 내가 원하는 타입이 할당되었는지 항상 주의하며 사용해야 합니다. 

 

AnyObject - 모든 클래스가 암시적으로 준수하는 프로토콜 타입입니다. 기본 라이브러리에는 AnyObject.Type이 AnyClass로 type alias가 되어 있습니다. 


3. 과제 및 실습

기념일 계산기 기능 구현하기

  • 데이트 피커의 날짜를 선택했을 때 이미지뷰 상단에 표시되어 있는 일자를 더해서 이미지 중앙에 날자를 표현했습니다.
  • 그 전에는 과제 내용을 이해를 잘못하여 주어진 날짜에서 빼는 기능을 구현하였습니다.
  • 처음에는 데이트 피커에서 받은 날짜와 이미지뷰 하나에 있는 날짜를 하나씩 계산하도록 구현하였습니다.
  • 따라서 카운트 변수를 만들어서 데이트 피커가 눌릴 때마다 스위치문에서 조건 판단할 수 있도록 기능구현을 했습니다.
  • 그리고 확장 기능을 활용해 Date타입에서도 뺄셈 기능이 생기도록 구현하였습니다. 
    var count = 0
    
    // MARK: - IBActions
    @IBAction func datePickersValueChanged(_ sender: UIDatePicker) {
        
        let datePicker = sender
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "ko_KR")
        formatter.timeZone = TimeZone(abbreviation: "GMT+00:00")
        datePicker.timeZone = TimeZone(secondsFromGMT: 9 * 60 * 60)
        datePicker.locale = Locale(identifier: "ko_KR")
        formatter.dateFormat = "yyyy년 MM월 dd일"
        let latterDate = datePicker.date

        switch count {
        case 0:
            let exactDate = specialDates[0]
            guard let earlierDate = formatter.date(from: exactDate) else { return }
            guard let days = (latterDate - earlierDate).day else { return }
            label1.text = "D+" + String(days)
            count += 1
        case 1:
            let exactDate = specialDates[1]
            guard let earlierDate = formatter.date(from: exactDate) else { return }
            guard let days = (latterDate - earlierDate).day else { return }
            label2.text = "D+" + String(days)
            count += 1
        case 2:
            let exactDate = specialDates[2]
            guard let earlierDate = formatter.date(from: exactDate) else { return }
            guard let days = (latterDate - earlierDate).day else { return }
            label3.text = "D+" + String(days)
            count += 1
        case 3:
            let exactDate = specialDates[3]
            guard let earlierDate = formatter.date(from: exactDate) else { return }
            guard let days = (latterDate - earlierDate).day else { return }
            label4.text = "D+" + String(days)
            count = 0
        default:
            break
        }
    }

  • 그 후 과제를 다시 파악 후, 100일 뒤, 200일 뒤 등을 계산하여 날짜를 표현하도록 구현하였습니다.
  • 코딩 작업을 할 때 문자열을 받아와서 Date 타입으로 변경하니 지역과 시간이 맞지 않아 Locale과 TimeZone을 활용해서 문제를 해결하였으나, 데이트 피커의 TimeZone은 바뀌지 않은 문제가 있었습니다.. 추후에 계속 해결해봐야 할 것 같습니다..
    @IBAction func datePickersValueChanged(_ sender: UIDatePicker) {
        

        let datePicker = sender
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "ko_KR")
        formatter.timeZone = TimeZone(abbreviation: "GMT+00:00")
        datePicker.timeZone = TimeZone(secondsFromGMT: 9 * 60 * 60)
        datePicker.locale = Locale(identifier: "ko_KR")
        formatter.dateFormat = "yyyy년\nMM월 dd일"

        let dates1 = datePicker.date + (86400 * 100)
        button1.setTitle(formatter.string(from: dates1), for: .normal)
        let dates2 = datePicker.date + (86400 * 200)
        button2.setTitle(formatter.string(from: dates2), for: .normal)
        let dates3 = datePicker.date + (86400 * 300)
        button3.setTitle(formatter.string(from: dates3), for: .normal)
        let dates4 = datePicker.date + (86400 * 400)
        button4.setTitle(formatter.string(from: dates4), for: .normal)
        
    }
    
}

4. 자료 출처

구글 검색어: major minor patch in swift -> https://developer.apple.com/documentation/packagedescription/version

구글 검색어: any anyobject swift -> https://www.avanderlee.com/swift/anyobject-any/

'기타' 카테고리의 다른 글

SeSAC TIL - 22.07.18  (0) 2022.07.20
SeSAC TIL - 22.07.15  (0) 2022.07.18
SeSAC TIL - 22.07.13  (0) 2022.07.18
SeSAC TIL - 22.07.12  (0) 2022.07.18
SeSAC TIL - 22.07.11  (0) 2022.07.17
Comments