아두이노와 함께 하기 위한 간단한 Swift 지식들


참고로 이 글은 Swift 2.2 기준입니다.
저도 구글링을 통하거나 네이버 검색을 통해 하나하나 만들어가고 있는데요.
기존 자료들이 Swift 2.2 이전 버전으로 구현된 것들이 많다보니 바로 적용하는
경우 오류가 발생할 때가 종종 있습니다. Swift 버전을 꼭 확인하시기 바랍니다~


1. selector 표현


selector라 하면 쉽게 생각해서 함수의 파라미터로 다른 함수를 넘길 때, 
이 파라미터로 넘어가는 함수의 type이라고 할 수 있다. 우리가 알고 있는
가장 유사한 예로 callback이라고 생각하면 될 것이다.


가장 흔한 예 중 하나가 NSTimer를 사용할 때이다.

NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(ViewController.sendMessage(_:)), userInfo: data, repeats: true)


여기서 3번째 selector라는 위치에 들어가는 인자가 Swift 2.2 이후 변경되었다.
간략하게 변천 과정을 보면 다음과 같다. (아래 예에서 : 기호는 selector에 인자를 넘긴다는 의미이다)


Objective-c : @selector(sendMessage:)
Swift (2.2 이전) : “sendMessage:”
Swift 2.2 : #selector(sendMessage(_:))


결국 NSTimer.scheduledTimerWithTimeInterval 함수의 의미는 매 1초마다(1번 인자), 반복적으로(5번 인자),
현재 클래스에 있는(2번 인자), sendMessage 함수를(3번 인자) 실행하라는 것이다. 여기서 4번 인자인 userInfo는
selector가 아닌 NSTimer에게 넘기는 부가 정보용 인자이다.


2. Byte 배열을 NSData로 형 변환하기


우선 Swift에는 Byte라는 type은 없다. Byte를 표현하기 위해서는 UInt8이라는 type을 사용하면 된다.
이 UInt8 type의 배열을 NSDate로 형변환 하기 위해서는 다음과 같이 한다.

let protocolData = NSData(bytes:[UInt8], length:6)


첫 번째 bytes 인자에 UInt8 배열을 넘기고 두 번째 length 인자에 UInt8 배열의 길이를 넘긴다.


3. 실행중인 함수명과 라인 수 로그로 찍기

print("\(#function) \(#line)")


4. Class 상속과 Override (재정의)


클래스 간의 상속은 다음과 같이 한다. (상속을 막기 위해서는 final 키워드를 사용한다.)

class SomeSuperClass {
  func sampleMethod () {
    print("printed from super class")
  }
}

// SomeSubClass는 SomeSuperClass를 상속한다.
class SomeSubClass: SomeSuperClass {
  // 부모 클래스의 함수를 Override할 경우 앞에 override 키워드를 붙인다. property도 마찬가지...
  override func sampleMethod() {
    print("printed from sub class")
  }
}


5. class의 import


사용자가 만든 .swift클래스는 import 할 필요 없이 그냥 사용하면 된다.
import는 framework를 사용할 때만 한다.

저작자 표시
신고


아두이노와 함께 하기 위한 간단한 Swift 지식들


이 글은 전문적으로 Swift를 학습하기 위한 것이 아니라 아두이노 개발과 관련하여 아이폰쪽 소스를
조금 더 잘 이해하고자 하는 목적입니다.


관련 소스 : https://github.com/mazdah/BluetoothController


1. 변수와 상수


let : 상수를 만들 때 사용하며 최초 한번 값을 할당하면 이후 값을 변경할 수 없음
var : 변수를 만들 때 사용


타입 지정은 필수가 아님
할당된 값은 암시적인 타입변환을 할 수 없음. 초기 값과 다른 타입으로 사용하기를 원한다면 
반드시 명시적으로 형 변환을 해주어야 함


문자열 안에 변수를(변수의 값을) 표현하고자 하면 다음과 같이 표현한다.
“문자열 안에 값을 쓰려면 \(변수명) 이렇게 쓴다”


배열과 딕셔너리는 []를 이용하여 만든다.


var sampleArray = [“a”, “b”, “c”, “d”, “e”]
var sampleDictionary = [
    “first”:”a”, 
    “second”:”b”, 
    “third”:”c”, 
    “fourth”:”d”, 
    “fifth”:”e”
]


빈 배열과 딕셔너리는 initializer를 사용한다.


let blankArray = String[]()
let blankDictionary = Dictionary<String, Float>()


타입을 명시적으로 사용할 수 없을 경우 다음과 같이 표기할 수 있다.


let blankArray =[]
let blankDictionary = [:]


2. 조건문


if의 조건문은 ()로 감싸지 않아도 된다. 하지만 코드를 감싸는 중괄호({})는 필수다.


if value == 1 {
    print("value = 1")
}


3. Optional


어떠한 변수나 상수에 값이 존재하는지 여부를 표현함
표현 방식은 다음과 같다.


var optionalInt: Int? = 100
var optionalString: String? = “this is optional String”
// 값을 초기화 하지 않으면 자동적으로 nil로 초기화 됨
var nilIn: Int?
var nilString: String?


어떤 optional이 값을 가지고 있으면 true, 값을 가지고 있지 않으면 false이다.


var optionalInt: Int? = 100

// 아래의 경우는 true가 출력된다.
if optionalInt {
	print("true")
} else {
	print("false")
}

var nilInt: Int?

 // 아래의 경우는 false가 출력된다.
 if nilInt {
	print("true")
 } else {
	print("false")
 }

nil은 optional이 아닌 상수나 변수와 사용할 수 없다.

Objective-c에서의 nil은 존재하지 않는 Object에 대한 포인터였다면 Swift에서의 nil은 포인터가 아닌 명확하게 값이 없다는 것에 대한 표현일 뿐이다. 때문에 어떤 타입에 대해서도 nil을 지정할 수 있다.


Optional binding


if문에서 다음과 같이 optional binding을 사용할 수 있다.


var optionalString = "123"

if let constantValue = optionalString.toInt() {
    println("\(optionalString) has an integer value of \(constantValue)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
} 


이 if문의 의미는 optionalString.toInt()가 리턴한 옵셔널 int가 값을 가지고 있을 경우 그 값을
constantValue에 할당하고 이후 constantValue는 ! 기호를 붙이지 않고 사용 가능하다.
optional binding은 변수와 상수에 모두 사용 가능하다.


Implicitly Unwrapped Optionals


만일 프로그램상에서 구조적으로 값이 있다는 것이 명확한 optional의 경우 ?가 아닌 !를 붙여
Implicitly Unwrapped Optional을 만들 수 있다.


//Optional
let possibleString: String? = "An optional string." 
// Implicitly Unwrapped Optional
let assumedString: String! = "An implicitly unwrapped optional string."


Implicitly Unwrapped Optional은 사용 시에도 Optional이 아닌 것처럼 사용할 수 있다.


//Optional의 사용
println(possibleString!)
// Implicitly Unwrapped Optional의 사용
println(assumedString)


Implicitly Unwrapped Optional도 Optional과 동일하게 if문을 통해 값을 가졌는지 체크하거나
optional binding 사용이 가능하다.


if assumedString {
    println(assumedString)
}

if let tempString = assumedString {
    print(tempString)
}


Optional 요약

  • 값이 없는 경우를 만들기 위해서는(nil을 할당하기 위해서는) Optional로 선언해야 한다.
  • Optional로 선언하게 되면 값이 Wrapping된다.
  • Optional 값을 사용하기 위해서는 Unwrapping 해야하는데 그 방법은 Optional 뒤에 !를 붙이는 것이다.
  • if문을 통해 optional binding을 이용하면 !를 붙이지 않고 다른 변수/상수에 값을 할당하여 그 변수/상수를 이용할 수 있다.
  • 최초 할당 이후 nil 값이 아닌 것이 확실한 경우 선언할 때부터 !를 붙이는 Implicitly Unwrapped Optional를 사용하며 이후 Optional이 아닌 것처럼 사용 가능하다.


저작자 표시
신고

+ Recent posts

티스토리 툴바