⭐️ 개발/iOS & Swift

⭐️ 개발/iOS & Swift

    [Swift] Class와 Struct 그리고 부스러기 개념들

    [Swift] Class와 Struct 그리고 부스러기 개념들

    Class / Struct 변수/상수가 클래스/구조체/열거형 등에 들어가면 프로퍼티라고 바뀌고, 함수는 메소드로 바뀜 그래서 프로퍼티랑 메소드는 멤버라고 부른다. 각각을 프로퍼티 멤버, 메소드 멤버라고 부른대!! 꺄! 흔히 알듯이, 클래스에 있는 프로퍼티와 메소드의 속성을 가진 걸 사용하기 위해 만들어주는 객체를 인스턴스라고 하고 이 인스턴스를 통해서 내부 프로퍼티와 메소드에 접근할 수 있다. 예를 들어, 붕어빵틀이라는 클래스가 있으면 슈붕이라는 인스턴스를 만들어서 내부 속재료 프로퍼티에 접근해서 슈붕.속재료 = "슈크림" 팥붕.속재료 = "팥" 이런식인 것처럼 말이지.. 여튼 슈붕과 팥붕은 붕어빵틀 클래스의 인스턴스다. 구조체와 클래스의 가장 큰 차이는 상속과 초기화 구문 제공..? 아닐까 싶다. 클래..

    [Swift] 스위프트 성능 이해하기1 - Struct / Class

    [Swift] 스위프트 성능 이해하기1 - Struct / Class

    프로토콜 지향 프로그래밍 POP 참조타입을 조심해야 된다. 클래스는 참조타입이지. 그리고 참조타입을 잘못 쓰다가는 원본을 참조하는 여러 인스턴스가 까딱하면 원본 데이터를 변경해버리기 때문이다. 그래서! 애플은 구조체를 권장하는 거다. 물론 다른 이유도 있겠지.. 구조체로 이루어진 많은 내부 타입들은 프로토콜 채택을 통해 기능들을 구현한다. 매번 채택하고 내부 메소드와 프로퍼티를 구현하는 걸까? 그건 아니다. 어떻게 해결하냐? 바로 Extension을 통해 가능하다. Extension을 통해 초기 기능을 구현해둔다. 그리고 각각의 실제 구현부에서 적합하도록 기능을 구현한다. 스택은 가장 마지막에 들어온 게 가장 먼저 나가는 단순한 구조라서 메모리 할당이랑 해제가 편하다. 스택은 스택 포인터로 할당, 해제를..

    [iOS] DataSource, Delegate | TextView Placeholder | WebKit

    [iOS] DataSource, Delegate | TextView Placeholder | WebKit

    Dear apple UIKit Developer UITextView Placeholder 만들어조 plz... Thx.. TextView Placeholder 텍뷰 플레이스홀더는 기본적으로 제공되지 않는다. 도대체 그 이유를 알 수가 없어. 왜 제공을 안하는 건지..;;여하튼! 그래서 눈속임으로 만들어주는 건데 대강 사용하는 건 UITextViewDelegate 프로토콜을 채택해 프로토콜 메소드를 통해서 기능을 구현해주면 된다. 내부에서 텍스트뷰가 편집이 시작될 시점과 편집이 끝나는 시점과 관련된 메소드를 잘 활용해서 플레이스 홀더 기능을 하게끔 텍스트뷰의 텍스트의 색상값과 텍스트값을 주면 된다. UIButton, UITextField > Action이 가능 UITextView, UISearchBar, ..

    [iOS] PickerView

    [iOS] PickerView

    PickerView 몇 개의 휠을 보여줄 거니? -> 2개의 휠을 보여주겠다. 하나의 휠에 몇 개의 row를 보여줄 거니? -> 첫 번째 휠이라면 10개의 row를, 두 번째 휠이라면 20개의 row를 보여줄 것이다. 전체적으로 보자면 이렇다. 그리고 꼭 델리게이트 위임처리를 해줘야 한다. UIPickerViewDelegate, DataSource는 부분은 아래처럼 써줄 수 있다. 세 번째 didSelectRow는 선택되면 어떤 동작을 할 건데? -> textField에 값을 줄게! 보통 이렇게 구현을 하고, 나의 경우는 같은 파일에서 하단에 extension을 통해서 코드를 분리해주는데 extension 파일을 분리해서 만드는 것도 가능한데, 현업에서 많이 보이는 코드 스타일은 하단에 배치해주는 경우가..

    [iOS] 프로토콜

    [iOS] 프로토콜

    프로토콜은 준수해준 곳, 채택해준 곳에서 실질적으로 구현한다. 선택적인 구현이 가능하다. 채택 개수에 제한이 없다. 어떤 프로토콜을 채택했냐에 따라 코드가 그려진다. - 프로토콜 내에서 옵셔널 요소는? @objc optional : 선택적 요청, Optional Requirement이라고 부른다. 프로토콜을 채택할 건데 안쓸 수 있는 아이들이 있기 때문에 optional 키워드를 붙이는 것이다. 옵셔널 요소를 포함하고 있다면 프로토콜 자체도 @objc(오브젝트 코드)를 붙여줘야 한다. @objc protocol ViewPresentableProtocol { func configureView() @objc optional func configureLabel() @objc optional func confi..

    [iOS] '처음으로' 돌아가는 코드 | SceneDelegate에서 분기처리해주는 코드

    [iOS] '처음으로' 돌아가는 코드 | SceneDelegate에서 분기처리해주는 코드

    특정 화면에서 특정 버튼을 누르면 앱을 다시 켠 것처럼 돌아갈 수 있게 해주는 코드이다. SceneDelegate를 쓸 수 있게 해주는 부분이고, 스토리보드를 사용한 부분이다. 만약 내가 이미 기존 사용자라면 UserDefaults를 사용해 값을 저장해두고, SceneDelegate에서 다음과 같이 분기처리를 해두고 처음 시작 화면을 바꿀 수도 있다. 우리가 기존에 사용하는 변수, 상수는 메모리 상에서 유지되기 때문에 화면전환을 통해 뷰컨이 메모리에서 제거되면 해당 변수, 상수의 데이터도 함께 사라진다. 근데 이 UserDefaults는 다르다. 프로그램의 실행이 종료되어도 사라지지 않는다. UserDefaults는 주로 가벼운 단일 데이터를 저장하기에 적합하다. 이를 통해서 자동 로그인, 앱 첫 실행 ..

    [Swift] Property Observer - didSet / willSet

    [Swift] Property Observer - didSet / willSet

    7/27 수요일 사실 프로퍼티 옵저버가 제일 .. 어떻게 언제 써먹어야 하는지 이해가 안간다... 변경 후 작업을 수행해서 UI를 업데이트하거나 변경 내용을 저장하는 didSet을 주로 사용한다고 한다.. willSet은 사실 많이 사용하진 않고, 속성이 변경되기 전에 프로그램 상태를 알아야 할 때 사용한다.. Property Observer 프로퍼티 옵저버, 말 그대로 저장 프로퍼티에서 사용되고, 값을 관찰하다가 변경되었을 때 호출된다. didSet, willSet이 있는데 willSet - 변경되기 직전에 didSet - 변경되고난 직후에 구조체에 dream이라는 인스턴스 저장 프로퍼티에서 사용되고 있는 걸 볼 수 있다. 초기값을 Designer라고 준 상태에서 해당 프로퍼티에 접근하기 위해 새 인스..

    [Swift] 타입/인스턴스 - 저장/연산 프로퍼티

    [Swift] 타입/인스턴스 - 저장/연산 프로퍼티

    7/26 TIL 헷갈리고도 헷갈리는 프로퍼티의 세계에 대해 공부한 걸 바탕으로 주저리주저리 읊어볼까 한다. 머리에 정립이 안되니 너무 헷갈려서.. 일단 읊어보면 이해되지 않을까? Property 구조체와 클래스 내에서 변수와 상수를 프로퍼티라고 부른다. 이 프로퍼티는 우선 타입 프로퍼티랑 인스턴스 프로퍼티로 나뉜다. (지금 말하는 이 두 프로퍼티들은 저장 프로퍼티의 특성을 띄는데 편의상 키워드는 생략하고 부르겠다.) 타입 프로퍼티와 인스턴스 프로퍼티 IceCream이라는 클래스가 있고 IceCream이라는 클래스 타입 내에 flavor라는 프로퍼티에 접근하고 싶다면 우리는 인스턴스를 생성해야 가능하다. var myIceCream = IceCream() myIceCream.flavor = "엄마는외계인" ..

    [Swift] 타입 프로퍼티 왜 씀?

    [Swift] 타입 프로퍼티 왜 씀?

    타입프로퍼티? 항상 tableViewCell이나 collectionViewCell 만들면 무의식적으로 반복해서 가장 먼저 만들어주던 코드 static let identifier = "BookTableViewCell" 이걸 왜 했던 걸까? 분명 그 당시에는 이유를 알고 있었는데.. 명확하게 설명 못하는 걸 보면 몰랐떤 것이지.. 아무튼 그 이유를 오늘 다시 알게 돼서 내 말로 정리를 하자면, 테이블뷰/컬렉션뷰를 만들어 줄 때 cellForRowAt 그러니까, 테블뷰/컬렉션뷰에 사용할 셀을 재사용해주는 과정에서 셀의 identifier을 문자열로 가져오는 경우가 있다. 이렇게... 그런데 이렇게 하다보면 휴먼에러로.. 오타가 나는 경우가 있고, 이걸 방지하기 위해서 타입 프로퍼티를 통해 해당 셀의 ident..

    [iOS] cell shadow + cornerRadius 같이 주는 방법

    [iOS] cell shadow + cornerRadius 같이 주는 방법

    쉐도우는 뷰 경계를 넘어서서 퍼져나가는 거라서 masksToBounds를 true로 해주면 적용이 안된다. 반면에 cornerRadius는 false로 해줘야 한다. 그래서 둘은 동상이몽임. 근데 같이 주고 싶은 경우에는 어떻게 해야 하나? 오늘 과제를 구현하면서 방법을 구글링하게 됐다. 매번 해도 매번 까먹는 거.... cell에 shadow를 넣고, contentView에 cornerRadius를 주면 된다. shadowRadius : 블러의 정도 : 값이 커질수록 퍼짐 shadowOffset : 그림자의 위치 - CGSize shadowOpacity : 그림자 모양 투명도 : 값이 커질수록 진해짐 shadowPath : 그림자모양 (커스텀이 가능)

    [iOS] Enum으로 코드 리팩토링

    주의 : 코드만 있음!! import UIKit enum SettingOptions: Int, CaseIterable { case total, personal, other var section: String { switch self { case .total: return "전체 설정" case .personal: return "개인 설정" case .other: return "기타" } } var rowTitle: [String] { switch self { case .total: return ["공지사항", "실험실", "버전 정보"] case .personal: return ["개인/보안", "알림", "채팅", "멀티프로필"] case .other: return ["고객센터/도움말"] } } } c..

    [iOS] for - in / forEach 동작구조?

    for - in 배열의 개수만큼 반복하기 때문에 for - in 반복문을 사용해서 배열의 모든 요소에 루프 상수로 접근이 가능하다. nums의 요소 개수만큼 반복문이 반복한다. 현재 반복문의 index도 알고 싶으면 enumerated / indices를 이용하거나, for (index, num) in nums.enumerated() { print("(index: \(index) num: \(num))") } for index in nums.indices { print("(index: \(index) num: \(nums[index]))") } 또는 배열의 개수에서 index로 접근해서 아래처럼 해줄 수도 있다. for index in 0..

    [iOS] Formatted API in iOS15

    [iOS] Formatted API in iOS15

    iOS15부터 나온 Formatted API 숫자, 날짜, 시간 등과 같은 데이터를 사용자가 원하는 현지화된 문자열로 변환해준다. 사용자의 디바이스의 위치와 언어설정에 따라 다르게 나올 수 있다. //: [Previous](@previous) import UIKit let value = Date() print(value) // 2022-07-13 07:10:50 +0000 print(value.formatted()) // PM/AM으로 정리되어서 나옴 print(value.formatted(date: .omitted, time: .shortened)) // 시간만 나옴 print(value.formatted(date: .complete, time: .shortened)) // 전체날짜가 영어로 나옴 pr..

    [iOS] Copy items if needed, Move to Trash

    [iOS] Copy items if needed, Move to Trash

    Xcode 프로젝트에 특정 파일을 추가할 때 항상 뜨는 이 창. 이 창에서 꼭 Copy items if needed, Create groups를 필수로 체크해야 한다. target도 마찬가지 이게 복제로 만들어서 쓰겠다는 뜻이라서 references를 누르면 안된다. 파일을 삭제할 때도 마찬가지로 Move to Trash를 선택해야 한다. Finder에 있는 파일을 Xcode에 넣을 때 reference로 넣으면 finder의 경로로 찍히게 되어서 추후에 해당 파일을 휴지통에 버리면 Xcode에 있던 파일도 같이 삭제되기 때문임.

    [iOS] Rendering Mode, Build Phases, NavigationController, TabBarController

    [iOS] Rendering Mode, Build Phases, NavigationController, TabBarController

    6일차,, 스보에서 오토레이아웃 잡는 게 어렵다.. 새삼 몰랐던 방법도 알고, 내가 얼마나 코드 베이스에만 집중했는지 알게 되는.. 순간... Build Phases 2번째 Compile Source 부분이 우리가 실행될 파일의 위치를 알려준다. 4번째 Copy Bundle Resources에는 예를 들어, Font 파일이 추가될 경우에 여기에도 추가되어야 한다. Alpha / Opacity 0.0 (투명) ~~~~~ 1.0 (불투명) 1. alpha - UIView에 속함 그래서 해당 뷰 하위에 있는 객체들한테도 속성이 적용됨 2. opacity - CALayer에 속함 하위 뷰에는 적용이 되지 않음 Rendering Mode Original Image : 원본 이미지의 색상 등등이 그대로 들어옴 Te..