profile
iOS Developer
post-thumbnail

[Swift | Library] Kingfisher

Kingfisher 알아보기 Kingfisher는 웹에서 이미지를 다운로드하고 캐싱 할 수 있는 Swift 라이브러리다. Xcode 프로젝트 Assert에 이미지를 추가하여 이미지를 로드하는 경우도 있지만, 네트워킹을 통해 웹의 이미지를 로드하는 경우는 일일이 이미지를 저장하여 불러오는 것이 불가능하다.. 이때 Kingfisher를 사용하면 웹 이미지를 보여줄 수 있다. >Kingfisher의 특징 (직역해서 말이 이상할 수 있음) 비동기로 이미지를 다운로드하고 캐싱 한다. URLSession 기반 네트워킹 또는 로컬 제공 데이터에서 이미지를 로드한다. 이미지 프로세서와 필터가 제공된다. 메모리와 디스크를 위한 다중 계층 하이브리드 캐시다. 캐시 동작을 상세하게 제어한다. (만료 날짜 및 크기 제한 등 사용자 지정 가능) 독립적인 구성요소로 필요에 따라 다운로더, 캐싱

2022년 5월 16일
·
0개의 댓글
·
post-thumbnail

[Swift 문법] private (set)

우리가 아는 private는 현재 있는 코드 블록 안에서만 접근이 가능하도록 해주는 키워드인데, private (set)은 뭘까? 미리 말하자면 값을 set 하는 것도 private 하겠다라는 것이다. 다음과 같은 MyProfile 구조체가 있다고 가정해보자. MyProfile 구조체 외부에서 phone 변수의 값을 변경하면 제대로 적용된다. 하지만 private (set) 키워드가 사용된 name 변수의 값을 변경하려면 에러가 발생한다. "Cannot assign to property: 'name' setter is inaccessible" 즉, 값을 변경할 수 없다는 것이다. ![](https://velog.velcdn.com/images/minji0801/post/3b6c8e4

2022년 5월 5일
·
0개의 댓글
·
post-thumbnail

[Swift 문법] protocol

프로토콜은 통신 규약을 뜻하는데.. 대체 뭐지? 싶을 거다. 쉽게 말하자면 지켜야 할 약속이다. 코딩에서는 구현되어야 할 메서드나 프로퍼티의 목록인 셈이다. 어... 그래도 모르겠어요.. 싶을 수 있으니! 코드로 살펴보자. 위의 프로토콜이 있다고 했을 때 다음과 같이 말하는 셈이다. > 안녕! 나는 Naming이라는 프로토콜이야. 나는 String 타입의 name 변수를 갖고 있는데, 값을 가져오고 설정할 수 있어. 그리고 또 나는 getName이라는 메서드를 갖고 있는데, String 값을 반환해! 그럼 Naming 프로토콜을 사용해 보자. 엇.. 에러가 뜨는데요.. 정말 당연한 거다. Naming 프로토콜은 name 변수와 getName 메서드를 가지고 있는데 적어주질 않았으니 적

2022년 5월 3일
·
0개의 댓글
·
post-thumbnail

[Swift 문법] weak self는 왜 쓸까?

클로저에 [weak self]를 넣어 순환 참조를 방지한 적이 있는가? 과연 순환 참조는 무엇이고 왜 어떻게 weak self로 순환 잠조를 막을 수 있는 것인지 알아보자. 순환 참조란? 순환 참조는 Strong Reference Cycle이라고도 하는데, 메모리 문제가 발생하는 원인이다. 우선 코드로 살펴보자. Person 타입의 john과 Apartment 타입의 unit4A 변수를 초기화한 후, 서로를 참조하고 있다. 두 변수에 nil이 입력되면 **서로를 참조하고 있던 것은 그대로

2022년 5월 3일
·
0개의 댓글
·
post-thumbnail

[Swift | Library] SnapKit

⚠️ SnapKit이 무엇인지 알아보는 것이 목적이기 때문에 SnapKit 문법에 대해서는 자세히 다루지 않았습니다. SnapKit 알아보기 SnapKit은 iOS와 OS X에서 AutoLayout을 쉽게 만들 수 있는 라이브러리다. 기본 코드와 비교 해보자! 우선, 위의 화면을 구성한다고 가정했을 때 기본 코드로만 AutoLayout을 작성하면 다음과 같다. viewDidLoad 내부가 constraints 코드다. 이제 SnapKit을 사용했을 때 코드를 살펴보자. ?????... 너무 당황스러울 정도로 코드가 짧아졌다.. ㅋㅋㅋ 필자가 SnapKit을 사용해 보면서 느낀 가장 큰 장점은 **동일한 constr

2022년 5월 2일
·
0개의 댓글
·
post-thumbnail

[iOS | Swift] 제 1회 빡코딩콘 참여 후기

유튜버 개발하는 정대리배 해커톤인 제1회 빡코딩콘이 2022.4.28 ~ 2022.5.1(4일) 동안 진행되었다. 주제는 메모 서비스고 앱, 웹 상관없지만 나는 iOS 앱으로 개발했다. 요구사항 화면구성 메모 목록 화면 메모 상세화면 메모 편집, 작성 화면 기능 사용자는 작성한 메모 목록을 볼 수 있어야 함 메모 목록에 노출되는 메모는 작성된 메모 문장 한 줄만 노출된다. 메모 작성 페이지에서 메모 작성이 가능하다. 메모를 작성할 때 작성된 메모의 글자 수가 노출된다. 사용자는 메모를 검색할 수 있어야 한다. 사용자는 메모를 편집할 수 있어야 한다. 사용자는 메모를 삭제할 수 있어야 한다. 작성된 메모는

2022년 5월 1일
·
0개의 댓글
·
post-thumbnail

[Swift 문법] Function vs Method

이 둘의 가장 큰 차이점은 클래스, 구조체, 열거형 안에 선언되었느냐이다. 함수 함수는 작업의 가장 작은 단위이자 코드의 집합을 말한다. func 키워드 작성된 것이 모두 함수다. 메소드 메소드는 클래스, 구조체, 열거형에 포함되어있는 함수를 말한다. 즉, 함수가 메소드를 포함하고 있는 셈이다. Xcode에서 앱 프로젝트를 만들면 기본으로 들어있는 ViewController.swift 파일을 흔히들 봤을 것이다. 여기에 ViewController는 클래스인데 이 안에 작성한 함수는 모두 메소드인 것이다. > 💙 참고한 블로그 https://zeddios.tistory.com/233

2022년 4월 27일
·
0개의 댓글
·
post-thumbnail

[Swift 문법] Struct vs Class

공통점 프로퍼티를 선언할 수 있다. 메서드를 선언할 수 있다. .으로 내부 값에 접근할 수 있다. 생서자로 초기 상태를 설정할 수 있다. extenstion으로 확장할 수 있다. 프로토콜을 채택해서 기능을 설정할 수 있다. 차이점 구조체는 값 타입이고, 클래스는 참조 타입이다. 그래서 구조체는 복사돼서 할당되고 클래스는 참조돼서 할당되기 때문에 동작이 다르다. 구조체는 값 타입, 클래스는 참조 타입! 하지만 아직 이 둘의 차이가 별로 와닿지 않는다. 더 파보자! 위에 보면 분명 co

2022년 4월 26일
·
0개의 댓글
·
post-thumbnail

[iOS | Swift] Custom Font 적용하기(+ 앱 내 폰트 변경 기능)

1. 폰트 파일을 프로젝트에 넣기 이때 중요한 점은 프로젝트를 타겟으로 해줘야 한다. Add to targets에 프로젝트명 체크해 주기! 2. Info.plist에 폰트 파일 추가하기 Info.plist로 가서 Fonts provided by application 아래에 방금 추가한 폰트 파일명을 그대로 복사해서 Item으로 넣어준다. 이때! 확장자명까지 입력해야 한다. > ⚠️ 주의! Info.plist에 Fonts provided by application 아래에 넣어야 한다! Fonts provided by application를 추가하면 자동으로 아래에 Item이 있을 것이다. 거기에 값으로 폰트 파일명을 넣는다. ![](https://velo

2022년 4월 25일
·
3개의 댓글
·
post-thumbnail

[Swift | Library] Cosmos

Cosmos는 손쉽게 별점을 구현할 수 있는 Swift Open Source Library다. https://github.com/evgenyneu/Cosmos Cosmos 라이브러리를 사용하지 않고 직접 별점 뷰를 구현한다면 UIStackView 안에 UIButton을 5개 넣고 Button Action을 구현해야 할 것이다. 버튼이 클릭되었을 때는 tag를 이용해서 각 버튼의 이미지를 컨트롤할 것이다. 이 모든 것을 단 몇 줄로 구현할 수 있는게 Cosmos 라이브러리다. 설치하기 Carthage, CocoaPods, Swift Package Manager로 설치할 수 있다. Carthage > CocoaPods > Swift Package Manager > h

2022년 4월 15일
·
0개의 댓글
·
post-thumbnail

[Xcode Archive Error] Invalid Provisioning Profile Signature. (프로비저닝 서명 인증서 만료)

얼마 전까지만 해도 잘만 되던 Archive가 갑자기 안된다. 에러는 다음과 같았다. > Invalid Provisioning Profile Signature. The provisioning profile included in the bundle 'com.alswl.Modakyi' (Payload/Modakyi.app) cannot be used to submit apps to the iOS App Store until it has a valid signature from Apple. (Expired profile signing certificate.) For more information, visit the iOS Developer Portal. With error code STATE_ERROR.VALI

2022년 4월 13일
·
1개의 댓글
·
post-thumbnail

[Swift | 프로그래머스 Lv.2] 멀쩡한 사각형 (Summer/Winter Coding 2019)

문제 문제 설명 가로 길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭지점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운 종이를 구할 수 없는 상태이기 때문에, 이 종이에서 원래 종이의 가로, 세로 방향과 평행하게 1cm × 1cm로 잘라 사용할 수 있는 만큼만 사용하기로 하였습니다. 가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 solution 함수를 완성해 주세요. 제한사항 W, H : 1억 이하의 자연수 입출력 예 W|H|result :|:|: 8|12|80

2022년 3월 6일
·
0개의 댓글
·
post-thumbnail

[Swift | 프로그래머스 Lv.2] 기능 개발 (스택/큐)

문제 문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자연수입니다. 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도

2022년 3월 6일
·
0개의 댓글
·
post-thumbnail

[Swift | 프로그래머스 Lv.2] k진수에서 소수 개수 구하기 (2022 KAKAO BLIND RECRUITMENT)

문제 문제 설명 양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다. 0P0처럼 소수 양쪽에 0이 있는 경우 P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우 P처럼 소수 양쪽에 아무것도 없는 경우 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다. 예를 들어, 101은 P가 될 수 없습니다. 예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.)

2022년 3월 2일
·
0개의 댓글
·
post-thumbnail

[Swift | 프로그래머스 Lv.1] 신고 결과 받기 (2022 KAKAO BLIND RECRUITMENT)

문제 문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다. 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다. 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다. k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다. 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다. 다음은 전체 유저 목록이 ["muzi", "frodo", "apeach", "neo"]이고, k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다. 유저 ID|유저가 신고한 ID|설명 :|:|: "muzi"|"frod

2022년 3월 1일
·
0개의 댓글
·
post-thumbnail

[Swift | 프로그래머스 Lv.2] [1차] 캐시 (2018 KAKAO BLIND RECRUITMENT)

문제 문제 설명 캐시 지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다. 이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다. 어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다. 어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오. 입력 형식 캐시 크기(cacheSize)와 도시이름 배열(cities)을 입력받는다. cacheSize는 정수이며, 범위는 0 ≦ cacheSize ≦ 30

2022년 2월 24일
·
0개의 댓글
·
post-thumbnail

[Swift 문법] typealias

typealias 키워드를 사용하면 별명을 부여할 수 있다. 새로운 타입을 만드는 것이 아니라 기존 타입에 별명만 붙여 사용하는 것이다. > 이렇게 타입 별칭으로 선언하면 이름(name)으로 기존 타입(existing type)을 대신하여 사용할 수 있다. 기존 타입(existing type)도 그대로 사용 가능하다. 즉, 둘 다 사용할 수 있다. typealias 선언은 제네릭 파라미터를 사용할 수 있다. 기존 타입의 일부 또는 모든 제네릭 파라미터에 대한 타입을 제공한다. 만약 제네릭 파라미터로 선언되면 사용될 때는 기존 타입의 제네릭 파라미터와 완벽하게 일치해야 한다. 즉, 아래 선언에서 별칭에 Hashable로 선언했지만 실제로 사용될 때는 Int 값만 받을 수 있다. 프로토콜 내에서도 typealias를 사용한다. 더 자주 사용되고 더 짧고 더 편리한 이름으로 제공할 수 있다. 아래 예

2022년 2월 24일
·
0개의 댓글
·
post-thumbnail

[Swift 문법] lazy

lazy 키워드를 붙여서 프로퍼티를 선언하면 단어 뜻 그대로 다른 프로퍼티보다 지연된다. 즉, 해당 프로퍼티가 처음 사용되기 전까지는 메모리에 올라가지 않는다. > ⭐️⭐️⭐️ 중요! lazy는 반드시 var 키워드를 사용해서 변수로 선언해야 한다. 그 이유는 공식 문서에 아주 잘 나와있는데, 프로퍼티가 초기화되기 전에 항상 값을 가지고 있어야 하는데 값이 없을 수도 있다. 그래서 lazy let이 아닌 lazy var로 선언해야 한다. (lazy let으로 선언하면 에러가 발생할 것이다.) Swift 공식 문서에 있는 예제를 가져와봤다. 여기서 importer 변수가 lazy로 선언되었다. 따라서 importer 변수가 사용되기 전까지는 DataImporter 인스턴스가 생성되지 않고 메모리에 올라가지 않는다. 즉, 지금은 DataManager의 data 변수만 사용되었으므로 DataImporter가 초기화되지 않은 셈이다

2022년 2월 24일
·
0개의 댓글
·
post-thumbnail

[iOS | Swift] Network 연결 확인하기

NetWork 프레임워크를 사용해서 현재 기기의 인터넷 연결 상태와 연결 타입을 알 수 있다. 네트워크 연결을 계속 감지하여 연결이 끊기면 실시간으로 알려준다. 1. NetworkMonitor 클래스 만들기 Network 프레임워크를 import하고 네트워크 연결을 감지하는 클래스를 별도로 만든다. NWPathMonitor로 현재 네트워크 연결 상태를 확인할 수 있다 2. AppDelegate에서 클래스 호출하기 앱이 실행되면 네트워크 연결을 확인하도록 NetworkCheck 클래스의 startMonitoring 메서드를 호출한다. [참고] 네트워크 연결 안 될 때 네트워크 연결이 안 되면 showNetwokrVCOnRoot 함수를 호출해서 화면에 Alert 창을 띄우도록 했다. > #### 💙 참고한 블로그 💙 https://qteveryday.tistory.com/m/314

2022년 2월 9일
·
0개의 댓글
·
post-thumbnail

[iOS | Swift] Modal dismiss 한 후 CollectionView Reload 하기 (NotificationCenter)

모달을 dismiss 한 후에는 viewWillAppear나 viewDidAppear가 실행되지 않기 때문에 CollectionView를 reload 하려면 NotificationCenter로 구현해야 한다. 아래 코드에서 HomeViewController와 DetailViewController가 나오는데 DetailViewController가 모달로 띄울 ViewController이고, HomeViewController는 DetailViewController가 dismiss된 후에 보이는 ViewController이다. 1. NotificationCenter Post 모달이 dismiss 될 때 NotificationCenter를 보낼 줄 것이다. DetailViewController가 사라지기 전인 viewWillDisappear에서 NotificationCenter를 보냈다. 2. NotificationCenter AddObserver

2022년 2월 9일
·
0개의 댓글
·