2024년 7월 19일 금요일

ChatGPT4 옴니 미니가 발표되서 하루정도 사용해 보고 있는데 놀랍네요. ㅎㅎ

 

용이 좀 더 저렴해지고 속도가 빨라진 모델입니다. 2024년 7월 18일에 발표된 모델입니다.

  1. 경제적인 가격: GPT-4o mini는 이전 모델들보다 훨씬 저렴합니다. 입력 토큰 100만 개당 15센트, 출력 토큰 100만 개당 60센트로, GPT-3.5 Turbo보다 60% 이상 저렴해졌습니다.

  2. 뛰어난 성능: 다양한 벤치마크 테스트에서 우수한 성능을 보여줍니다. 특히 수학적 추론, 코딩, 다중 모달 추론 등에서 탁월한 능력을 자랑합니다.

  3. 다양한 기능: 텍스트뿐만 아니라 이미지도 처리할 수 있으며, 앞으로 비디오와 오디오도 지원할 예정입니다.

  4. 안전성: OpenAI는 모델 개발 과정에서 안전성을 최우선으로 고려했습니다. 혐오 발언, 성인 콘텐츠, 개인정보 등을 필터링하고, 모델의 행동을 OpenAI의 정책에 맞게 조정했습니다.

아래와 같이 아이폰 앱을 만들 경우 사용하는 SwiftUI의 코드를 생성해 보고 있는데 엄청난 생산성을 자랑합니다. 틀린 코드도 많이 나오지만 30분정도 조작을 하면 훌륭하게 동작하는 코드들이 나옵니다. ㅎㅎ

상단에 모델을 선택할 때 GPT 4o mini가 추가되었습니다.






전체 생성된 코드입니다. 

import SwiftUI


// NavigationState 클래스는 네비게이션 상태를 관리합니다.

class NavigationState: ObservableObject {

    @Published var path: NavigationPath = NavigationPath() // 현재 네비게이션 경로를 저장합니다.

}


struct ContentView: View {

    @StateObject private var navigationState = NavigationState() // NavigationState의 인스턴스를 생성하고 상태를 관리합니다.

    

    var body: some View {

        // NavigationStack을 사용하여 네비게이션을 관리합니다.

        // path는 NavigationState의 path와 연결되어 현재 네비게이션 경로를 관리합니다.

        NavigationStack(path: $navigationState.path) {

            // 첫 번째 화면을 표시합니다.

            FirstView(navigationState: navigationState)

        }

    }

}


// 첫 번째 화면

struct FirstView: View, Hashable {

    @ObservedObject var navigationState: NavigationState // NavigationState를 관찰합니다.

    

    // Hashable 프로토콜을 채택하여 네비게이션 경로에 사용될 수 있도록 합니다.

    static func == (lhs: FirstView, rhs: FirstView) -> Bool {

        return lhs.navigationState === rhs.navigationState

    }

    

    func hash(into hasher: inout Hasher) {

        hasher.combine(ObjectIdentifier(navigationState))

    }

    

    var body: some View {

        VStack {

            Text("First View")

                .font(.largeTitle)

        }

        .navigationTitle("First View") // 내비게이션 바의 제목을 설정합니다.

        .navigationBarItems(trailing: Button("Go to Second") {

            // 버튼 클릭 시 SecondView를 네비게이션 경로에 추가하여 화면을 전환합니다.

            navigationState.path.append(SecondView(navigationState: navigationState))

        })

        // SecondView, ThirdView, FourthView로의 네비게이션 경로를 설정합니다.

        .navigationDestination(for: SecondView.self) { secondView in

            secondView

                .navigationDestination(for: ThirdView.self) { thirdView in

                    thirdView

                        .navigationDestination(for: FourthView.self) { fourthView in

                            fourthView

                        }

                }

        }

    }

}


// 두 번째 화면

struct SecondView: View, Hashable {

    @ObservedObject var navigationState: NavigationState // NavigationState를 관찰합니다.

    

    // Hashable 프로토콜을 채택하여 네비게이션 경로에 사용될 수 있도록 합니다.

    static func == (lhs: SecondView, rhs: SecondView) -> Bool {

        return lhs.navigationState === rhs.navigationState

    }

    

    func hash(into hasher: inout Hasher) {

        hasher.combine(ObjectIdentifier(navigationState))

    }

    

    var body: some View {

        VStack {

            Text("Second View")

                .font(.largeTitle)

        }

        .navigationTitle("Second View") // 내비게이션 바의 제목을 설정합니다.

        .navigationBarItems(trailing: Button("Go to Third") {

            // 버튼 클릭 시 ThirdView를 네비게이션 경로에 추가하여 화면을 전환합니다.

            navigationState.path.append(ThirdView(navigationState: navigationState))

        })

    }

}


// 세 번째 화면

struct ThirdView: View, Hashable {

    @ObservedObject var navigationState: NavigationState // NavigationState를 관찰합니다.

    

    // Hashable 프로토콜을 채택하여 네비게이션 경로에 사용될 수 있도록 합니다.

    static func == (lhs: ThirdView, rhs: ThirdView) -> Bool {

        return lhs.navigationState === rhs.navigationState

    }

    

    func hash(into hasher: inout Hasher) {

        hasher.combine(ObjectIdentifier(navigationState))

    }

    

    var body: some View {

        VStack {

            Text("Third View")

                .font(.largeTitle)

        }

        .navigationTitle("Third View") // 내비게이션 바의 제목을 설정합니다.

        .navigationBarItems(trailing: Button("Go to Fourth") {

            // 버튼 클릭 시 FourthView를 네비게이션 경로에 추가하여 화면을 전환합니다.

            navigationState.path.append(FourthView(navigationState: navigationState))

        })

    }

}


// 네 번째 화면

struct FourthView: View, Hashable {

    @ObservedObject var navigationState: NavigationState // NavigationState를 관찰합니다.

    

    // Hashable 프로토콜을 채택하여 네비게이션 경로에 사용될 수 있도록 합니다.

    static func == (lhs: FourthView, rhs: FourthView) -> Bool {

        return lhs.navigationState === rhs.navigationState

    }

    

    func hash(into hasher: inout Hasher) {

        hasher.combine(ObjectIdentifier(navigationState))

    }

    

    var body: some View {

        VStack {

            Text("Fourth View")

                .font(.largeTitle)

            

            Spacer()

            

            Button(action: {

                // 두 화면을 제거하여 SecondView로 돌아가기

                if navigationState.path.count >= 2 {

                    navigationState.path.removeLast(2)

                }

            }) {

                Text("Go to Second View")

                    .foregroundColor(.blue)

            }

            

            Button(action: {

                // 전체 네비게이션 경로를 제거하여 FirstView로 돌아가기

                navigationState.path = NavigationPath()

            }) {

                Text("Go to First View")

                    .foregroundColor(.blue)

            }

            

            Spacer()

        }

        .navigationTitle("Fourth View") // 내비게이션 바의 제목을 설정합니다.

    }

}








아이폰 개발 과정 교재 업데이트 작업을 하고 있습니다. ㅎㅎ

 항상 가을이 되면 iOS업데이트와 Xcode업데이트가 있어서 강의가 없어도 바쁘게 교재작업을 하고 있습니다. ㅎㅎ 크게 변경된 부분은 없습니다. 거의 동일합니다. iOS는 18버전이고 Xcode는 16버전입니다.  다만 Xcode에서 AI기능의 도입...