전체 Objective-C 앱을 Swift로 변환하기 위한 단계별 가이드

게시 됨: 2018-03-14

2014년에 출시된 이후로 Apple의 프로그래밍 언어인 Swift는 경이적인 성장을 거듭했습니다. 프로그래밍 언어는 상위 10개 프로그래밍 언어 의 골칫거리에서 그 자리를 지키며 이전 버전인 Objective-C와 위치 공유합니다. 그러나 스위프트 대 오브젝티브-C의 전쟁은 결코 진정되지 않습니다.

이러한 인기와 흥미로운 기능으로 인해 이전에 Obj-C로 작업하던 많은 iOS 애플리케이션 개발자가 Swift 프로그래밍 언어로 전환했습니다. 사실 iOS용 Swift 또는 Objective-C의 싸움에서 LinkedIn, Yahoo Weather, Hipmunk 및 Lyft와 같은 다양한 iOS 앱은 이미 Objective-C에서 Swift로 업그레이드되었으며 많은 사람들이 Objective-C 앱으로 전환할 계획입니다. 스위프트에게.

SWIFT를 더 나은 옵션으로 만드는 요인

개인적으로, 나는 첫 번째 버전이 공개된 이후로 Swift의 진화를 보았고 Swift와 C 사이에서 Swift가 다음과 같은 요소를 기반으로 Objective-C를 대체 한다고 말할 수 있습니다.

오픈 소스

Swift는 오픈 소스 언어이며 Swift 코드는 Objective-C보다 훨씬 더 많은 플랫폼에서 이식 가능합니다.

속도

iOS 개발용 Swift는 LLVM 컴파일러와 함께 작동하고 기존 코드를 재사용하고, 사용하지 않는 리소스를 삭제하고, 인라인 함수를 관리하는 등의 작업을 수행할 수 있는 정적 유형 언어입니다. 게다가, 그 작업은 C++에서 가장 빠른 알고리즘 계산 ​​산술 중 하나를 기반으로 하므로 이전 제품보다 경쟁력이 있음을 증명합니다.

Apple이 주장하고 내가 경험한 바에 따르면 Swift 검색 알고리즘은 Objective-C보다 2.6배 빠릅니다.

가독성

Objective-C와 달리 Swift는 C 기반에 묶여 있지 않습니다. iOS 개발자는 중첩된 메서드 호출을 제거하고, 줄 끝에서 세미콜론을 건너뛰고, 키워드 시작 부분에 @를 넣지 않고, "+" 기호를 사용하여 문자열을 연결하는 등의 작업을 수행할 수 있습니다. 또한, Swift 클래스는 부분, 인터페이스 및 구현으로 나뉘지 않습니다. 이렇게 하면 코드 길이가 거의 절반으로 줄어들어 가독성이 높아집니다.

예를 들어 Lyft 앱이 처음부터 Swift 언어로 다시 작성되었을 때 앱 코드는 75,000줄에서 25,000줄로 줄었습니다. 이 인상적인 수치는 고객 측에서 앱의 성능에 영향을 주지 않으면서 개발자의 노력을 줄여줍니다.

인터랙티브 코딩

Playgrounds 기능을 통해 프로그래머는 개발 단계에 따라 피드백을 수집하면서 코드나 알고리즘의 덩어리를 작성할 수 있습니다. Swift 코드는 데이터 시각화를 사용하여 작성되므로 앱 개발 프로세스 가 더 쉽고 접근하기 쉬워집니다.

안전

Swift는 현재 시장 동향에 따라 앱을 빌드하기 위한 더 안전하고 안전한 언어입니다. 구문 및 언어 구성은 Objective-C 언어로 코딩하는 동안 일반적으로 관찰되는 실수 유형을 제외했습니다. 이는 앱 충돌 및 문제가 있는 동작의 경우가 더 적다는 것을 의미합니다.

오브젝티브-C의 경우와 달리 스위프트로 작성된 코드를 컴파일하고 오류를 수정하고 코드 작성 부분을 함께 할 수 있다. 따라서 Swift는 Objective-C 코드를 테스트하는 프로세스와 비교할 때 테스트 프로세스에서 더 빠르고 빠르게 작동합니다.

유지

Swift는 전임자처럼 C에 의존하지 않기 때문에 Swift 앱 개발의 경우 유지 관리가 훨씬 쉽습니다. Swift를 iOS 앱 개발의 미래로 만든 것 .

Objective-C를 사용하여 iOS 앱을 빌드하는 경우 개발자는 빌드 시간과 코드 효율성을 높이기 위해 두 개의 고유한 코드 파일을 유지해야 했습니다. 그러나 Swift는 Objective-C 헤더(.h)와 구현 파일(.m)을 단일 파일(.swift)로 병합하여 이 두 파일 메커니즘을 삭제했습니다. LLVM 컴파일러는 Swift 파일을 읽는 동안 종속성을 자동으로 발견하므로 iOS 애플리케이션 개발자에게 큰 이점이 됩니다.

위에서 언급한 요소 외에도 다른 Apple의 프로그래밍 언어보다 Swift를 선택하는 이점은 Objective-C와의 호환성입니다. Apple은 앱 개발자에게 동일한 프로젝트에서 두 언어를 모두 사용할 수 있는 기능을 제공했습니다. 이것은 Swift를 사용하여 iOS 앱을 처음부터 개발하는 경우뿐만 아니라 Objective-C 코드를 사용하여 기존 앱을 Swift로 업그레이드하는 경우에도 유용합니다.

이제 두 iOS 애플리케이션 개발 언어 간의 철학적 차이점에 익숙하지만 실제 구현과 함께 차이점으로 이동하겠습니다.

SWIFT 대 OBJECTIVE-C: IOS 개발의 거물 간의 주요 차이점

복잡한 Objective-C 코드베이스 및 Swift 코드베이스에 대한 제 경험을 통해 앱 개발 프로세스를 신속하게 만드는 다양한 새로운 요소에 대한 소개와 함께 기존 개념에 대한 몇 가지 업그레이드를 접하게 될 것입니다. 고민하지 않고 신속 대 객관적인 전쟁에서 새로운/다르게 찾을 수 있는 모든 것을 살펴보겠습니다. c.

선택 사항

swift vs Objective-C 성능에 대해 이야기할 때 Obj-C에서 0 값을 얻기 위해 nil 객체에 대한 메서드를 호출할 수 있습니다. 예상치 못한 nil 값의 경우 정의되지 않은 동작을 이해하기 위해 수동으로 nil-check를 수행해야 합니다. 그러나 이 문제는 Swift 코드에 도입된 새로운 개념인 Optional을 사용하여 해결할 수 있습니다. Optional을 사용하면 의미 있는 값을 반환할 수 없는 함수가 optional 또는 nil로 캡슐화된 값을 반환할 수 있습니다.

Optional 유형을 선언하는 구문은 다음과 같습니다.

공개 열거형 Optional<Wrapped> :_Reflectable, NilLiteralConvertible

실제로는 Wrapped 유형의 값이나 존재하지 않는 값을 가질 수 있습니다.

Swift는 유형 선언에 대한 구문 설탕을 선택 사항으로 렌더링하므로 Optional<String>을 String으로 바꿀 수 있습니까?

선택적 컨테이너에서 래핑된 값을 얻는 데는 주로 두 가지 방법이 있습니다.

선택적 연결: if-let 조건문이 존재하는 경우에만 값을 수신하는 경우에 사용됩니다.
강제 래핑: 선택적 선언 변수가 nil이 아닌 경우에 사용됩니다. 값이 있으면 조건을 구현하지 않고 출력을 제공합니다. 그러나 다른 경우에는 충돌합니다.
또한 String으로 선언된 Swift 언어에서 암시적으로 래핑되지 않은 옵션을 찾을 수 있습니다!

예를 들어:

클래스 X클래스

{

var aString: 문자열

var bString: 문자열!

var cString: 문자열?

초기화(문자열: 문자열)

{

문자열 = 문자열

}

}

여기,

String은 절대 nil이 될 수 없습니다. 이 변수는 객체 초기화 동안 값을 갖는 것이 중요합니다. 그렇지 않으면 프로그램이 충돌을 일으킬 것입니다.
B 문자열은 0일 수 있습니다. 그러나 nil 개체에 액세스하려고 하면 프로그램이 충돌합니다.
C 문자열은 nil일 수 있으며 일반 선택적 변수로 취급되어야 합니다.
확장
Obj-C에서 찾을 수 있는 확장 및 범주는 Swift 언어의 확장인 단일 엔터티로 통합됩니다. 확장은 이미 존재하는 클래스, 열거, 구조 또는 프로토콜에 새로운 기능을 추가하며 가장 좋은 부분은 유형을 확장하기 위해 원래 소스 코드에 액세스할 필요가 없다는 것입니다.

튜플
Optionals 외에도 Apple의 새로운 개발 언어에 도입된 또 다른 새로운 데이터 유형은 Tuples입니다. 튜플(현재 사용자 정의 데이터 유형)은 기본적으로 많은 값을 단일 복합 그룹으로 그룹화하는 것으로 간주됩니다. 한 장소에서 모델을 만드는 것이 과도하고 사전이 충분히 독자 친화적이지 않다고 생각한다면 고려해야 할 올바른 요소입니다. 더 많은 Tuple을 알고 싶다면 이 블로그 를 참조하십시오.

제네릭
Generics는 Swift 프로그래밍 언어의 가장 눈에 띄는 기능 중 하나이며 실제로 Swift 표준 라이브러리의 대부분은 Swift 코드로 생성됩니다. 일반 코드를 사용하면 개발자가 정의된 요구 사항에 따라 다른 유형 집합과 함께 작동할 수 있는 유연하고 재사용 가능한 함수 및 유형을 작성할 수 있습니다. 이는 중복 위험을 최소화하고 명확하고 추상화된 접근 방식으로 코드 가독성을 향상시킵니다.

내 경험에 따르면 Generics는 재귀와 마찬가지로 처음에는 얻기가 어렵습니다. 그러나 그것을 손에 넣으면 지루한 논리적 문제를 해결하는 완전히 새로운 세계를 풀 수 있을 것입니다.

열거
Objective-C 코드에서 열거형은 기본 유형으로 제한됩니다. 출력을 표시하기 위해 정수 열거형 값을 문자열의 값으로 매핑하려면 배열을 도입하거나 스위치 제어 구조로 전환해야 합니다. 그러나 Swift iOS 앱 개발 언어로 이러한 번거로움을 겪을 필요는 없습니다.

Swift는 더 많은 옵션과 함께 다양하고 새로운 열거를 제공합니다. Swift 열거형은 연관된 값을 가질 수 있고 Swift 열거형 케이스는 미리 정의된 필드 세트를 보유할 수 있습니다. 사실, Swift 열거형은 재귀적일 수 있고 원시 값을 저장할 수 있습니다.

예를 들어:
코드

첨자
첨자는 메서드를 사용하지 않고 클래스, 열거형 및 구조의 시퀀스, 컬렉션 또는 목록에서 정보에 액세스하는 매체로 볼 수 있습니다. 저장 및 검색을 위한 별도의 메서드를 만들지 않고도 인덱스별로 값을 설정하고 검색하기 위해 첨자를 고려할 수 있습니다. 예를 들어 Array 인스턴스의 요소는 someArray[index]로, Dictionary 인스턴스의 요소는 someDictionary[key]로 액세스할 수 있습니다.

Subscript 선언 구문은 다음과 같습니다.

첨자(색인: Int) -> Int {

가져 오기 {

//아래 첨자 값을 선언하기 위해

}

(새 값) 설정 {

//값 정의용

}

}

유형 추론

또한 Swift는 iOS 애플리케이션 개발을 위한 유형 안전성을 제안했는데, 특정 유형으로 선언된 변수에 따라 해당 유형은 정적이고 변경할 수 없습니다. 컴파일러는 할당한 값을 기반으로 변수의 유형을 결정(또는 추론)합니다.

예를 들어:

코드 1
여기서 컴파일러는 숫자 값을 사용하여 str2 변수로 초기화하려고 하면 오류를 표시합니다(아래 참조).

코드 03

기능
Swift 프로그래밍 언어의 함수 구문은 복잡한 Objective-C 코드 스타일보다 정의하기에 더 유연합니다. Swift에서 모든 함수에는 함수의 매개변수 유형과 반환 유형으로 구성된 유형이 있습니다. 이는 변수에 함수를 할당하거나 다른 함수에 값으로 전달할 수 있음을 의미합니다(아래 예 참조).

코드의 이미지

이 외에도 Swift는 앱 개발자가 기능 매개변수에 대한 기본값을 정의할 수 있도록 합니다.

오류 처리
Swift는 런타임에 복구 가능한 오류를 throw, catch, 순환 및 조작하는 완전히 새로운 접근 방식을 제공합니다. Swift에서 오류 처리를 살펴보려면 블로그를 참조하십시오.

이 외에도 Swift 앱 개발을 Objective-C 앱 개발보다 윈-윈하게 만드는 다양한 개념은 다음과 같습니다.

모델
Swift의 경우 모델은 클래스보다는 구조체가 선호됩니다.

프로토콜
Apple WWDC 비디오의 맨 처음에서 swift는 "프로토콜 지향 언어"로 소개되었습니다. 프로토콜은 특정 작업/기능에 적합한 메서드, 속성 및 기타 엔터티의 청사진으로 정의할 수 있습니다. 이러한 요구 사항의 실제 구현을 용이하게 하기 위해 클래스, 열거 또는 구조에 포함될 수 있으며 기본 구현 제공, 제네릭 통합 등의 기능으로 Obj C에 비해 훨씬 더 강력합니다.

iOS 앱 개발자로서 저는 고급 Apple 프로그래밍 언어의 이점을 활용하기 위한 가장 효과적인 방법으로 클래스를 정의하기 전에 프로토콜을 만드는 것을 선호합니다.

함수형 프로그래밍 접근
Swift는 개발자가 기존 루프 또는 참조 유형을 사용하는 것보다 일상적인 문제를 해결하기 위해 더 많은 기능적 접근 방식을 사용할 수 있도록 합니다. 여기에서 관점은 기존 접근 방식에서 수행한 대로 솔루션을 얻는 방법을 결정하는 대신 솔루션이 무엇인지 측면에서 문제를 분석하는 것입니다.

두 iOS 언어에 대한 내 경험에서 한 가지 알아차린 것은 Objective-C에서 for 루프를 사용하여 반복적으로 수행하던 작업이 Swift의 Filter, Map 및 Reduce 개념을 사용하여 수행될 수 있다는 것입니다. 함수형 프로그래밍에서 이러한 고차 함수에 대한 자세한 정보를 얻으려면 블로그를 참조하십시오.

전체 OBJECTIVE-C 앱을 SWIFT로 변환하기 위한 단계별 가이드

오늘날 Objective-C에서 Swift로 한 줄씩 앱을 변환하는 다양한 도구가 있습니다. 그러나 아무 것도 사용하지 않는 것이 좋습니다. 두 iOS 언어 모두 상호 운용 가능하지만 프로그램 패러다임이 다릅니다. Obj-C에서 Swift로 직접 앱을 마이그레이션하면 잘못된 패러다임을 사용할 위험이 더 높아집니다. 이에 대해 자세히 설명하겠습니다.

Swift는 이전 버전과 달리 불변성에 크게 의존하는 함수형 프로그래밍 패러다임의 영향을 받습니다. 예를 들어 배열과 사전에 대해 이야기하는 경우 이러한 기본 모델은 Objective-C에서 참조 유형으로 사용되지만 Swift에서는 값 유형이므로 변경할 수 없습니다. 이것은 어떤 도구를 사용하여 무의식적으로 Obj-C 코드를 Swift로 변환하면 디버그하기 힘든 많은 오류에 직면하게 될 것임을 의미합니다. 게다가, Swift는 알고리즘/접근법을 보다 효율적으로 바꾸고 프로그램을 신속하게 만드는 수많은 새로운 기능(위에서 이미 설명한 대로)을 가지고 있습니다! 사실, 그것이 Apple이 Obj-C를 업그레이드하기 보다는 새로운 언어를 공개한 주된 이유입니다. 이러한 모든 사항을 고려하여 Obj-C에서 Swift로 한 줄씩 변환하는 것보다 Swift에서 새 앱을 처음부터 작성하는 것이 좋습니다.

그래도 전체 Objective-C 앱을 Swift로 변환하려는 경우 사용할 수 있는 도구 중 하나는 Swiftify입니다. 이 도구는 Obj-C 코드를 한 번의 클릭으로 Apple의 새로운 프로그래밍 언어로 업그레이드하는 프로세스를 용이하게 합니다. 수천 시간의 작업 시간을 절약합니다. 상호 운용성 기능을 사용하면 변환된 iOS 코드를 번거로움 없이 다시 Objective-C로 통합할 수 있습니다. 이는 Swift가 제공하는 수많은 옵션을 탐색한 다음 모든 것을 한 번에 다시 작성하지 않고도 Obj-C 프로젝트에 다시 통합할 수 있음을 의미합니다.

전환을 위해 기존 앱 코드 준비
항상 최신 Obj-C 코드로 시작하는 것이 좋습니다. 이는 Xcode가 다음과 같은 작업에 도움이 될 수 있는 최신 Objective-C 변환기를 사용하기 때문입니다.

1. 가능한 한 id를 instancetype으로 변경
2. 올바른 열거형 매크로 사용
3. 최신 @property 구문으로 업그레이드

변환기는 잠재적인 변경 사항을 분석하고 적용하는 메커니즘을 지원하지만 코드의 의미는 설명하지 않습니다. 따라서 모든 iOS 애플리케이션 개발자는 모든 것을 수동으로 한 번 검토한 다음 변경 사항을 확인하는 것이 좋습니다.

변환기를 사용하려면 편집 -> 리팩터링 -> 최신 Objective-C 구문으로 변경을 선택합니다.

Objective-C 코드를 Swift로 마이그레이션하는 과정
전체 Objective-C 앱을 Swift로 변환하는 가장 효과적인 접근 방식은 우선 한 번에 한 클래스, 특히 Obj-C에서 Swift 클래스를 하위 클래스로 분류할 수 없기 때문에 하위 클래스가 없는 클래스를 시작하는 것입니다.

클래스와 관련된 .m 및 .h 파일을 단일 .swift 파일로 교체합니다. 이를 통해 인터페이스에서 구현에 이르는 모든 것이 자동으로 Swift 파일에 들어갑니다. 또한 필요한 경우 Xcode가 자동으로 헤더를 생성하므로 헤더 파일을 생성할 필요가 없습니다.

브리징 헤더 파일 디자인
첫 번째 .swift 파일을 추가하면 아래와 같은 프롬프트가 표시됩니다.

스위프트 코드12

' 브리징 헤더 만들기 ' 옵션을 클릭합니다.

단계별 가이드

1. Swift로 변환하려는 .h 및 .m 파일 쌍을 선택합니다. 전체 프로젝트를 변환하려면 나중에 사용할 수 있도록 AppDelegate 클래스를 그대로 두십시오.
2. 코드 전체에서 #import "MyViewController.h"를 검색하고 Objective-C 브리징 헤더 파일([MyProject]-Bridging-Header.h)에서 제거합니다.
3. 모든 .m 파일에서 #import "[filename].h" 인스턴스를 #import "[MyProject]-Swift.h"로 교체하고 #import "[filename].h" 대신 @class [filename]을 입력합니다. 모든 .h 파일.
4. Obj-C 파일의 일부를 Swift로 변환합니다. 이것은 'Swiftify for Xcode'의 Finder 확장을 사용하여 쉽게 수행할 수 있습니다. 그렇지 않으면 .m 및 .h 파일의 내용을 .swift로 복사하고 Swiftify Xcode 확장에서 사용할 수 있는 "파일을 Swift로 변환" 옵션을 사용하십시오.
5. 프로젝트에서 .h 및 .m 파일을 변환된 .swift 파일로 교체합니다.
6. 프로젝트를 컴파일하고 변환 오류를 수정합니다. Xcode 자동 수정 제안을 사용하여 많은 문제를 쉽게 관리할 수 있지만 프로젝트에 여러 번 나타나는 오류를 보고하고 수정하기 위해 Swiftify를 사용할 수도 있습니다.
7. 완료되면 프로젝트를 빌드하고 실행합니다. '클래스를 찾을 수 없음' 문제가 발생한 후 충돌이 발생하면 스토리보드 편집기에서 이에 대한 모든 참조를 찾으십시오. Identity Inspector에 클래스 이름을 다시 입력하고 저장하고 다시 시도하십시오.
8. 전체 프로젝트를 변환하는 경우 지금 AppDelegate 클래스를 변환할 수 있습니다. 이 시점에서 다른 모든 파일은 Swift로 변환되었으므로 대상에 남아 있는 Obj-C 파일이 없으면 main.m 및 .pch(미리 컴파일된 헤더) 파일을 쉽게 삭제할 수 있습니다.

Swift에서 새 iOS 앱을 처음부터 만들거나 Objective-C를 Swift로 완전히 변환하는 방법 중 어떤 방법을 선호합니까? 아래 댓글 섹션을 통해 의견을 공유하세요.