Swift 3.0에서는 for문을 사용할 수 없다

2015-12-22
11 Views

[vc_row][vc_column][vc_column_text]Swift가 현재 오픈소스로 공개되면서 Swift 2.x에서 3.x버전으로 올라가게 되면 어떤 변화가 있는지 확인이 가능해졌습니다. 버전이 올라가게 될 때 포함되는 기능이나 삭제되는 기능이 어떻게 결정되는가를 살펴보면 다음과 같은 형태로 정해지는 것 같습니다.

  1. 제안
  2. 리뷰
  3. 채택

이런 제안은 애플사 내부뿐만아니라 애플 외부 사용자들의 제안도 가능하게 되어 있습니다. 이런 제안에서 특히 상징적으로 확인된 것중 하나가 C-Style의 for문 제거라는 것인데 Swift 3.0에서는 삭제되는 것으로 공식적으로 정해졌습니다.

이 제안(Proposal)은 Erica Sadun의 제안으로 진행된 것으로 구체적으로 이야기하면 다음과 같은 구문은 사용할 수 없게 된다는 것입니다.

[/vc_column_text][vc_column_text]

[code lang=”swift”]
for var i=0; i<99; i++ {
print("(i)")
}
[/code]

[/vc_column_text][vc_column_text]Objective-C언어에서는 주로 사용하던 스타일로 이것이 없어진다면 기존 Objective-C언어나 C언어를 공부하거나 이를 통해 앱개발을 하던 개발자들은 Swift언어로 넘어올때 오류를 자주 범하게 될 가능성이 있습니다. 그리고 이미 Swift언어로 개발을 하는 개발자들이라면 이런 스타일로 많이 코딩하고 있다고 보여집니다.

그렇지만 익숙한 구문을 없어지게 하여 아예 사용하지 못하게 하는 것인가?라는 의문을 가지게 하지만 사용할 수 있다고 말하고 싶습니다. 물론 앞으로 Swift언어로 코딩을 하는 개발자라면 이런 점들을 고려하여 Swift 3.0이 발표된 이후 그에 따른 수정을 나중에 고생해서 하는 것보다는 지금부터 고려해서 코딩하길 바랍니다.

이전까지는 WWDC에서 발표될 때까지 어떤 변화가 있는지 확인하기 어려웠지만, 오픈소스화되면서 미리 대책을 세울 수 있게 되었다는 것입니다.[/vc_column_text][vc_custom_heading text=”예제” use_theme_fonts=”yes”][vc_column_text]일반적인 for문 (Swift 3.0에서는 아래 구문을 사용할 수 없습니다)

[code lang=”swift”]
for var i=0; i<99; i++ {
print("(i)")
}
[/code]

앞으로는 for-in을 사용하여 해결이 가능합니다.

[code lang=”swift”]
for i in 0..<99 {
print("(i)")
}
[/code]

또는 다음과 같은 forEach로 해결할수도 있습니다.

[code lang=”swift”]
Array(0..<99).forEach{print("($0)")}
[/code]

이처럼 간단한 형태라면 기존 for문보다 간결하게 작성할 수 있습니다.

[/vc_column_text][vc_column_text]만약, 배열 인덱스가 중요할 경우, 예로 홀수 인덱스 요소만 사용한다면 어떻게 해야할까?
Swift 3.0에서는 사용할 수 없는 기존 방식

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for var i=0; i<arr.count; i++ {
if(i%2) != 0 {
print("(arr[i])")
}
}
[/code]

이를 다시 for-in을 사용하면, 배열이 독특한 요소로만 구성되어 있는 경우에만 가능합니다.

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for s in arr {
if let ix = arr.indexOf(s) {
if(ix%2) != 0 {
print("(arr[ix])")
}
}
}
[/code]

단, 중복 요소가 있을 경우, indexOf는 정확한 인덱스를 얻을 수 없습니다. 인덱스에 따라 요소를 얻으려면, stride를 사용하는 것이 좋다고 생각됩니다.

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for i in 1.stride(to: arr.count, by: 2) {
print("(arr[i])")
}
[/code]

그리고 enumerate는 인덱스와 요소의 튜플의 배열을 생성해주는 SequenceType에 정의된 메소드입니다.
기존 방법은 다음과 같이 사용합니다. (이것은 Swift 3.0에서는 사용할 수 없습니다)

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for (ix, emt) in arr.enumerate() {
if (ix%2) != 0 {
print("(emt)")
}
}
[/code]

이를 for-in을 사용하지 않고 다음과 같이 작성해서 해결할 수 있습니다.

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
arr.enumerate().filter { ($0.0%2 != 0)}.map{$0.1}
arr.enumerate().flatMap { ($0.0%2 != 0) ? $0.1 : nil}
[/code]

타이틀은 for문이 없어진다라고 했지만, map과 filter, enumerate등이 새로운 것이 이지만 swift언어의 표준 라이브러리에 포함되어야 것을 이용하면 그다지 문제는 없습니다. 이제부터라도 앞으로 Swift 3.0을 위해 C언어스타일의 for문 코딩을 줄이기 바랍니다.[/vc_column_text][/vc_column][/vc_row]

Facebook Comments

You may be interested

Xcode 기능 확장(Extension) 제거하기
Xcode
shares3 views
Xcode
shares3 views

Xcode 기능 확장(Extension) 제거하기

MJ Kim - 3월 18, 2017

Mac에서 Xcode Source Editor Extension등의 기능확장을 사용하다보면 디버깅시 시스템 환경 설정의 확장이 앱에 등록되는 경우가 있다. 계속해서 목록이 남아 있기…

iOS App Store Review(앱 심사약관) 번역
Swift 3.0
shares109 views
Swift 3.0
shares109 views

iOS App Store Review(앱 심사약관) 번역

MJ Kim - 3월 15, 2017

App Store Review를 번역했다. 사실 이번에 좀 애매한 리젝을 당해서 그걸 이해하고자 정리해본다. 원문링크: https://developer.apple.com/app-store/review/guidelines/ 1. 이약관은? 1.1 앱 개발자로서 프로그램의…

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi
IoT by Raspberry Pi
shares7 views
IoT by Raspberry Pi
shares7 views

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi

MJ Kim - 3월 04, 2017

RPi1114-Raspberry Pi전원제어 모듈이 있다. 이 제품은 40Pin GPIO핀헤더에 연결하여 사용하는 모듈로 Cortax-M0마이크로컨트롤러 LPC1114를 내장하고 Raspberry Pi의 시작과 정지 순서등을 프로그래밍할…