SwiftUI도 해볼 겸 카탈리나(beta 9)를 설치했다.

 

IP 주소

 

모바히까지는 와아파이 아이콘을 옵션 + 클릭하면 IP 주소가 바로 나타났는데, 카탈리나를 설치하니 더이상 안나온다. 네트워크 환경설정에 가면 나오기는 하는데, 한 번 더 클릭해서 들어가야 하므로 조금(많이) 불편하다.

 

 

 

CocoaPods

 

brew를 이용해서 cocoapods를 설치해서 사용했다. 카탈리나 설치 후 cocoapods 설치는 성공했는데 실행하면 다음과 같은 에러가 발생한다.

/usr/local/bin/pod: /usr/local/Cellar/cocoapods/1.7.5/libexec/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby: bad interpreter: No such file or directory/usr/local/bin/pod: line 2: /usr/local/Cellar/cocoapods/1.7.5/libexec/bin/pod: Undefined error: 0

구글링해서 다음과 같은 옵션을 주고 설치하라는 글을 보고 설치 시도~. 아까와 같은 에러가 발생하지 않는다.

brew install cocoapods --build-from-source

 

React-Native

 

시뮬레이터

 

Xcode11을 설치했더니 리액티브 네이티브에서 iOS 동작시킬 때 다음과 같은 에러가 발생한다.

error Could not find iPhone X simulator. Run CLI with --verbose flag for more details.

Xcode11에 iPhone X 시뮬레이터가 없어서 발생하는 에러다. 다음과 같이 simulator 옵션을 이용해서 시뮬레이터를 직접 지정해주면 동작한다.

% react-native run-ios --simulator 'iPhone 11'

매번 옵션 주기 귀찮으면 Xcode에서 iPhone X 시뮬레이터를 설치하면 된다.(Window -> Devices and Simulators)

 

 

에러

 

리액트 네이티브(v60)iOS 앱을 동작시키니 아래와 같은 에러가 발생한다.

 

 

구글링을 하니 다음과 같이 node_modules내 리액티 네이티브 코드를 수정하라고 한다. 소스 코드는 node_modules/react-native/React/Base/RCTModuleMethod.mm 93번째 라인.

 

코드

 

반응형

swift로 진행하던 프로젝트를 날 잡고 Swift 1.2로 변경했다. 수정한 내용을 정리해본다.


전역 함수 변경



countElement 함수는 count로 바뀌었다.




Objective-C 타입 호환



Swift 1.1 에서는 NSString과 String 타입 사이에 자동으로 타입 변환이 가능(bridging)했었다.



var str1 : NSString = "NSString String Val"

var str2 : String = str1



Swift 1.2 부터는 NSString과 String 사이에 암시적 타입 변환이 지원되지 않는다. 다음과 같이 as를 이용해서 타입 변환 코드를 작성해야 한다.



var str1 : NSString = "NSString String Val"

var str2 : String = str1 as String


배열도 마찬가지다. Swift 1.1 에서 NSArray의 경우 Array와 임시적으로 타입 변환이 가능했다.



var array1 : NSArray = [1, 2, 3, 4]

var array2 : Array = array1



Swift 1.2 에서는 다음과 같이 NSArray에서 Array 객체를 생성한다.



var array1 : NSArray = [1, 2, 3, 4]

var array2 : Array = Array(array1)




프로퍼티와 메소드


다음과 같이 프로퍼티와 메소드를 작성하면 v1.1 과 v1.2 모두 에러가 발생한다.

class Singer {

  var name : String = "EXID"

  

  func name() -> String {

    return "IU"

  }

}


이 코드를 조금 바꿔보자. 상속을 이용해서 프로퍼티와 메소드를 분리하면 v1.1에서 에러가 발생하지 않는다. 다음은 부모 클래스에 프로퍼티를, 자식 클래스에 메소드를 작성했다.


class Person : NSObject {

  var name : String!

}


class Singer : Person {

  func name() -> String {

    return "IU"

  }

}


Swift 1.2에서는 다음과 같이 에러가 난다. 


셀렉터로 인한 에러이므로 부모 클래스가 NSObject가 아니면 에러가 발생하지 않는다.





타입 변환(down cast)



Swift 1.1까지 타입 캐스팅은 다음과 같았다.


  • as
  • as?


Swift 1.2에 as!가 추가됐다. 이제 다운 캐스팅은 as!를 사용한다.

  • as!


iOS 개발을 하면서 테이블에서 셀 다룰 때 자주 접하게 된다. 재사용 셀을 찾는 코드에서 셀 타입 변환을 as로 했다면,


tableView.dequeueReusableCellWithIdentifier("CustomCell") as CustomWell


Swift 1.2에서 as!를 사용한다.


tableView.dequeueReusableCellWithIdentifier("CustomCell"as

CustomCell

타겟-액션의 액션 메소드에서 센더 타입 캐스팅에서도 as!를 쓰게 된다.


@IBAction func handleSegmentChange(sender : AnyObject) {

  let segmentedControl = sender as! UISegmentedControl

  println("Selection : \(segmentedControl.selectedSegmentIndex)")

}


NSArray나 NSDictionary 에서도 사용하게 된다.



상수 초기화


Swift 1.1 에서 상수는 선언하면서 초기값을 설정해야한다. 1.2 부터 상수를 선언하고 사용하기 전에만 초기값을 설정하면 된다.


let condition = true

let fileName : String


if condition {

    fileName = "image1.png"

}

else {

    fileName = "image2.png"

}




연산자




Swift 1.1에서 |= 연산자를 사용할 수 있다.


var i = true

i |= false



Swift 1.2에서는 안된다. 다음과 같이 작성해야 한다.


var i = true

i = i || false




Set 타입


Set 타입이 생겼다.


var letters = Set<Character>()

var favoriteGenres : Set = ["Rock", "Classical", "Hip hop"]



외부 파라미터 이름


메소드의 파라미터 중 두 번째 파라미터부터 외부 파라미터 이름을 사용해서 호출한다. 다음은 예제로 사용할 코드다. 메소드에 3개의 파라미터가 있고 마지막 파라미터의 타입이 클로저다.


class MyClass {

    func add(val1 : Int, val2 : Int, handler : (Int)->Void ) {

        handler(val1 + val2)

    }

}


Swift 1.1에서, 파라미터 중 마지막 파라미터가 클로저라면 외부 파라미터 이름을 생략할 수 있다.


var obj = MyClass()


obj.add(1, val2: 3, {(result : Int) -> Void in

  println("1 + 3 = \(result)")

})


Swift 1.2에서, 마지막 파라미터가 클로저 타입이라 해도 외부 파라미터 이름을 명시적으로 작성해야 한다.


obj.add(1, val2: 3, handler: {(result : Int) -> Void in

  println("1 + 3 = \(result)")

})



Incremental Build


Xcode 6.3 에서의 가장 큰 변화는 Incremental Build다. 6.3 이전에는 소스 코드 일부만 변경해도 전체를 컴파일 했지만 Xcode 6.3부터는 변경된 부분만 컴파일하는 Incremental Build를 지원한다.


현재 프로젝트에서 빌드 시간 테스트를 해보니 다음과 같다.


테스트 환경 : 5k iMac


Xcode 6.2

전체 빌드 : 46, 44초

코드 일부 수정 후 빌드 : 27, 25초

 Xcode 6.3

전체 빌드 : 53, 55초

코드 일부 수정 후 빌드 : 6, 5.6초


빌드 시간이 확실히 줄었다!



Swift 언어 변환 기능


Xcode에는 Swift 코드 변환 기능을 제공한다.




코드 변환 기능을 사용하면 다음과 코드를 비교하면서 수정할 수 있다.







반응형

+ Recent posts