본문으로 건너뛰기

SwiftUI - Custom View Modifier

· 약 1분
Jeonghun Kim
Frontend Developer

Custom Modifier란?

SwiftUI에서 Custom Modifier란 사용자가 정의한 수정자. SwiftUI에서는 ViewModifier 프로토콜을 준수하는 구조체로 이를 구현하여 사용자 정의 수정자를 만들 수 있다.

  • CustomModifier.swift

    import SwiftUI

    struct CustomModifier: ViewModifier {
    func body(content: Content) -> some View {
    content
    .padding(10)
    .background(Color.gray)
    .cornerRadius(10)
    }
    }

    extension View {
    func customViewModifier() -> some View {
    modifier(CustomModifier())
    }
    }

    extension View {
    func customViewModifier2() -> some View {
    self
    .font(.title)
    .padding(10)
    .foregroundColor(.red)
    }
    }

  • CustomButtonView.swift

    import SwiftUI

    struct CustomButtonView<Content: View>: View {
    let content: Content
    let action: () -> Void

    public init(
    @ViewBuilder content: () -> Content,
    action: @escaping () -> Void
    ) {
    self.content = content()
    self.action = action
    }

    public var body: some View {
    Button(action: {
    action()
    }) {
    content
    .padding(10)
    .background(Color.red)
    .cornerRadius(10)
    .foregroundColor(.white)
    }
    }
    }

Custom Modifier 적용

SwiftUI - AppDelegate 사용

· 약 2분
Jeonghun Kim
Frontend Developer

NSObject란?

SwiftUI는 Swift 기반의 UI 프레임워크이지만, Objective-C와의 상호운용성을 고려하여 설계됨. 따라서 NSObject를 사용하여 Objective-C 코드와의 호환성을 유지하거나 기존 코드를 재활용하는 경우에는 NSObject를 사용.

  • Objective-C 호환성: SwiftUI는 Objective-C와의 상호운용성을 제공하기 때문에, Objective-C에서 정의된 클래스나 라이브러리를 SwiftUI에서 사용할 수 있다.

  • UIKit과의 연동: UIKit 기반의 앱에서 SwiftUI를 점진적으로 도입하는 경우, NSObject를 사용하여 UIKit 뷰 컨트롤러와 상호작용 필요.

  • 기존 코드 재사용: 기존 Objective-C 또는 UIKit 프로젝트에서 사용하던 NSObject 클래스나 라이브러리를 SwiftUI에서 재사용하려면 NSObject를 상속하거나 포함해야 됨.

SwiftUI - View

· 약 1분
Jeonghun Kim
Frontend Developer
struct MyView: View {
var body: some View {
VStack {
titleView
titleView2()
TitleView3()
}
}

// MARK: 프로퍼티
var titleView: some View {
Text("title")
}

// MARK: 메서드
func titleView2() -> some View {
Text("title2")
}
}


// MARK: 구조체 하위뷰
private struct TitleView3: View {
fileprivate var body: some View {
Text("title3")
}
}

구조체로 정의

장점:

  • 재사용 가능한 커스텀 View를 정의할 수 있습니다.

  • SwiftUI가 자동으로 상태 관리를 처리하기 때문에, 데이터의 변경에 대한 업데이트를 처리하기 쉽습니다.

단점:

SwiftUI - Protocol

· 약 2분
Jeonghun Kim
Frontend Developer

인터페이스(Interface) 개념을 지원하는 Swift 기능.

프로토콜은 특정 동작이나 속성의 청사진 또는 규약을 나타내는 추상적인 타입.

프로토콜 구현 예제

protocol ProtocolName {
// 메서드 요구사항
func methodName()

// 속성 요구사항
var property: Type { get set }
}

struct MyStruct: ProtocolName {
// ProtocolName 프로토콜의 메서드와 속성을 구현
func methodName() {
// 구현 내용
}

var property: Type {
get {
// getter 구현
}
set {
// setter 구현
}
}
}

비교 : SwiftUI , TS , JAVA

SwiftUI

SwiftUI - Generic

· 약 1분
Jeonghun Kim
Frontend Developer

제네릭(Generic)은 데이터 형식이나 함수를 일반화하고, 재사용 가능한 코드를 작성하는 데 도움을 주는 기능.

제네릭은 특정한 데이터 형식에 의존하지 않고, 여러 다양한 데이터 형식에 대해 동일한 코드를 작성할 수 있음.

비교 : SwiftUI , TS , JAVA

SwiftUI

import SwiftUI

struct MyArray<T> {
var data: [T] = []

mutating func append(_ item: T) {
data.append(item)
}

func printAll() {
data.forEach { item in
print(item)
}
}
}

struct ExamGeneric_Previews: PreviewProvider {
static var previews: some View {

var myInt = MyArray<Int>()
var myStr = MyArray<String>()

myInt.append(1)
myInt.append(2)
myInt.printAll()

myStr.append("A")
myStr.append("B")
myStr.printAll()

return Text("Hello, world!")
}
}

TS

SwiftUI - Struct, State, Binding

· 약 2분
Jeonghun Kim
Frontend Developer

struct와 class 비교

Swift에서 구조체(struct)와 클래스(class)는 둘 다 데이터를 그룹화하고 동작을 정의하는데 사용되지만 몇가지 차이점이 있다.

  1. 값 타입(Value Type): 구조체는 값 타입(value type)이다. 구조체의 인스턴스가 복사되어 전달될 때 데이터가 복사된다는 것을 의미합니다. 클래스는 참조 타입(reference type)이므로 인스턴스가 참조로 전달되고 공유됨. 이러한 값 타입 특성은 데이터의 불변성을 쉽게 유지하고 예기치 않은 부작용을 방지.
  2. 불변성(Immutability): 구조체의 속성을 선언할 때 상수(let)로 정의하면 해당 속성은 변경할 수 없다. 이것은 데이터의 불변성을 강제함. 클래스는 속성을 상수로 선언해도 인스턴스의 내용을 변경할 수 있기 때문에 불변성을 갖추기가 어려움.
  3. 스레드 안전(Thread Safety): 구조체는 스레드 간에 데이터를 공유하지 않으므로 스레드 안전성을 제공. 클래스는 여러 스레드에서 공유되므로 동시 접근에 대한 조치를 취해야 함.

SwiftUI - 옵셔널 변수, 암시적 언래핑

· 약 1분
Jeonghun Kim
Frontend Developer

옵셔널 타입 변수

UI 요소의 상태나 속성이 정의되지 않았거나 초기화되지 않았을 때 사용. 도중에 nil 을 할당할 수 있다.

  • 옵셔널 바인딩

    옵셔널 변수의 값을 안전하게 추출하기 위해 if let 또는 guard let 문을 사용할 수 있음.

    var age: Int? = 30

    age = 20
    age = nil

    if let unwrappedAge = age {
    print("나이는 \(unwrappedAge)세 입니다.")
    } else {
    print("나이 정보가 없습니다.")
    }

implicitly unwrapped optional

"SwiftUI" 태그로 연결된 7개 게시물개의 게시물이 있습니다.

SwiftUI 및 iOS 개발

모든 태그 보기