hello swift 2/5 - basic2
DESCRIPTION
# Hello Swift 1/5 http://www.slideshare.net/ssusere2153e/hello-swift-01 # Table of Contents - static - typealias - loop with dictionary - readability numeric value - optional value - unwrapped optional value - binding optional - implicitly unwrapped optional - tupleTRANSCRIPT
Welcome to Swift 2/5
•static
•typealias
•loop with dictionary
•readability numeric value
•optional value
•unwrapped optional value
•binding optional
•implicitly unwrapped optional
•tuple
다룰 내용
static
// 정적변수를 만드는것은 불가능합니다. 오로지 클래스 내부에서 정적멤버변수, 정적멤버함수를 만드는것만 가능합니다. 클래스를 다룰 때 다시 하도록 하겠습니다.
loop with dictionary
let numberOfLegs = ["spider":8,"dog":4, "ant":6]
for (animal,legCount) in numberOfLegs { println("\(animal) leg is \(legCount)")}
Optional Type
// Optional Type은 변수 선언 후 : 뒤에 변수의 Type과 함께 ?를 추가하여 지정할 수 있습니다.var optionalInteger1: Int? = 100
// Int?이라고 Optional Type을 지정하면, 내부적으로는 Optional<Int>로 치환합니다.var optionalInteger2: Optional<Int>
// 그럼 어디에 사용될까요? 123이라는 문자열은 toInt()를 통해 Int type으로 값이 변환됩니다. convertedValue가 코드상에서는 보이지 앟지만 Int?으로 Optional Type입니다.let value = "123"let convertedValue = value.toInt()
Optional Type
let value = "123"let convertedValue = value.toInt()// 위와 같은 코드는 문제가 되지 않습니다. 123이라는 문자열은 toInt()를 통해 정상적으로 Int type으로 값이 변환되기 때문입니다.
// 하지만 아래와 같은 코드는요?let value2 = "동해물과백두산이"let convertedValue = value.toInt()
Optional Type
let value = "123"let convertedValue = value.toInt()// 위와 같은 코드는 문제가 되지 않습니다. 123이라는 문자열은 toInt()를 통해 정상적으로 Int type으로 값이 변환되기 때문입니다.
// 하지만 아래와 같은 코드는요?let value2 = "동해물과백두산이"let convertedValue = value.toInt()
// 다행이 Swift에서는 문제가 되지 않습니다. 바로 toInt()가 반환하는것은 Int가 아니라 Int?이기 때문입니다. Int와 Int?는 무슨 차이 일까요? 바로 Optional한 Value를 가지고 있느냐 없느냐의 차이입니다.
Optional Type
let value = "123"let convertedValue = value.toInt()// 위와 같은 코드는 문제가 되지 않습니다. 123이라는 문자열은 toInt()를 통해 정상적으로 Int type으로 값이 변환되기 때문입니다.
// 하지만 아래와 같은 코드는요?let value2 = "동해물과백두산이"let convertedValue = value.toInt()
// 다행이 Swift에서는 문제가 되지 않습니다. 바로 toInt()가 반환하는것은 Int가 아니라 Int?이기 때문입니다. Int와 Int?는 무슨 차이 일까요? 바로 Optional한 Value를 가지고 있느냐 없느냐의 차이입니다.
// Optional Type이라는 것은 값을 반환할 때 값이 없는것을 지칭하는 nil이라는 값을 반환할 수 있다는 Option을 염두해두라는 이야기합니다. 아직도 이야기는 어렵습니다.
Optional Type
// Java에서는 String parse to Int 구문을 try~catch를 이용하여 아래와 같이 작성할 수 있습니다. 다른 언어에서는 try-catch 구문이 아니더라도, 해당 메소드가 처리 실패시 반환하는 값을 알고 있어야, 상황에 따른 예외처리가 가능합니다.
Optional Type
// 하지만 아래와 같은 코드는요?let value2 = "동해물과백두산이"let convertedValue = value.toInt()
// toInt()의 결과로 실패 시 반환하는 Int?(Optional Type)은 nil값을 가집니다. 물론 Objective-C에서도 nil값이 있지만, Swift에서는 Object뿐만이 아니라 모든 타입(구조체,열거형,기본타입을 포함)에서도 nil값을 가질 수 있습니다.
Unwrapped Optional Value
let value = "123"let convertedValue = value.toInt()
let result = convertedValue+10// 위와 같은 코드는 어떤결과를 반환할까요? 123+10은 133이니, 133이라는 값이 result에 assign될까요?
Unwrapped Optional Value
let value = "123"let convertedValue = value.toInt()
let result = convertedValue+10// 위와 같은 코드는 어떤결과를 반환할까요? 123+10은 133이니, 133이라는 값이 result에 assign될까요?
// 아닙니다. 위와 같은 에러를 반환합니다. 즉 nil이라는 optional한 특수한 value를 포함하고 있는 Int?와 10이라는 값을 +연산자를 통해 연산할 수 없다는 이야기입니다.
Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?
Unwrapped Optional Value
let value = "123"let convertedValue = value.toInt()
let result = convertedValue!+10// 그래서 Wrapped된 Optional한 Variable을 Unwrapped시켜주는 !를 사용해야 합니다.
// 그런데 우리는 여기에서 주의해야 합니다. Optional Variable에 !를 이용해서 Wrapped 후 값을 꺼내오는 코드를 작성할때, 만약 Optional Variable에 nil이 있을 경우 Runtime Error가 발생합니다.
Forced unwrapped optional value
//그런데 if나 while의 condition 영역에서는 조금 특이하게 작동합니다. 즉, Optional Variable을 Unwrapped시켜주는 !를 사용하지 않아도, 강제로 Unwrapped됩니다. 아래 예제를 살펴보도록 하겠습니다.
let value = "123"if let convertedValue = value.toInt() { var result = convertedValue+10}
//차이점이라면 toInt()메소드의 반환결과가 let이나 var변수를 저장되는데, 이때 if의 condition 영역에 선언 및 assign하고 있다는 것 입니다. 즉, if의 condition 영역에서는 Wrapped되어 있는 변수가 강제로 Unwrapped되는 상황이 발생한다는 것 입니다.
// 바로 if나 while의 condition구문에서 forced unwrapping되는 것을 가리켜 “Optional Binding”이라고 합니다.
Implicitly Unwrapped Optionals
//그런데 Optional Type은 너무 불편합니다. 해당값이 Optional Type인지 아닌지를 판단하고, 값에 접근할때는 Unwrapped시켜주는 !를 이용해야 합니다.
// 바로 이러한것을 해결해 주는 방법이 아래와 같습니다.let value = "123"let convertedValue: Int! = value.toInt()if convertedValue { var result = convertedValue+10}
// 아래 코드와 비교해 보겠습니다.let value = "123"let convertedValue: Int? = value.toInt()if convertedValue { var result = convertedValue!+10}
Implicitly Unwrapped Optionals
//그런데 Optional Type은 너무 불편합니다. 해당값이 Optional Type인지 아닌지를 판단하고, 값에 접근할때는 Unwrapped시켜주는 !를 이용해야 합니다.
// 바로 이러한것을 해결해 주는 방법이 아래와 같습니다.let value = "123"let convertedValue: Int! = value.toInt()if convertedValue { var result = convertedValue+10}
// 아래 코드와 비교해 보겠습니다.let value = "123"let convertedValue: Int? = value.toInt()if convertedValue { var result = convertedValue!+10}
typealias
//typealias는 C/C++의 치환 역활을 하는 typedef와 동일한 역활을 수행합니다. 아래와 같이 type을 재정의할 수 있습니다.
typealias AudioSample = UInt16typealias NameAndAge = Dictionary<String,Int>var ourPeople = NameAndAge()ourPeople["Cody"] = 32
//개인작업에서는 유효할 지 모르겠으나, 팀작업에서는 코드리뷰 중 typealias에 의해 치환된 내용이 나올 때 치환된 코드가 있는곳으로 이동하여, 확인을 해야되는 번거러움이 분명히 존재합니다. 지나친 사용은 독이 될 수 있는 문법입니다.
readability with under bar
//아래와 같이 특정 지점에 under bar를 사용하여 0의 갯수를 카운트하는데, 조금 더 수월하게 해줄 수 있습니다. 하지만, 이것 역시 잘못된 위치에 under bar가 포함될 경우 디버깅 난이도를 급격히 끌어올 릴 수 있을 것 같습니다-_-
let price1 = 1000000000000000let price2 = 1_000_000_000_000_000
tuple//튜플은 여러개의 값을 묶어서 여기저기에서 사용할 수 있는 기능힙니다.
// assign and accesss with indexlet nameAndAge = ("Cody",32)nameAndAge.0nameAndAge.1
// decompose with another constant valuelet (name,age) = nameAndAgenameage
// or if you want single value without anotherlet (justName,_) = nameAndAgejustName
// make tuple variable or constant and using the value in tuplelet currentStatus = (code:404,message:"Not found")currentStatus.codecurrentStatus.message
애플 개발가이드 문서
https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/TheBasics.html
•Optional Type 대신에 무조건 Implicitly
Unwrapped Optional을 사용하면 되지 않을까?
•typealias를 어느 정도 선에서 사용해야 할까?
•under bar를 이용해 numeric value를 작성하는 것
은 정말 readability를 올려줄까? 특정값이 코드상에
하드코딩되는 일은 드믄일 아닌가?
생각해 볼 내용
감사합니다.
let writer = ["Cody":"Yun"]