2014년 12월 22일 월요일

애플의 새로운 개발언어 Swift - 문자열 처리 #6

// Playground - noun: a place where people can play

import UIKit

let str:String = "Swift string"
let emptyString = " "
let anotherEmptyString = String()
let ch: Character = "S"

if emptyString.isEmpty {
    println("빈문자열")
} else {
    println("공백문자가 있음")
}

//이제 + 연산자가 지원됨
let founder = "Steve Jobs"
let ceo = "Tim Cook"
let leader = founder + " & " + ceo

//문자열의 길이 체크 
let str2 = "Swift Language"
println("length of str2: \(countElements(str2))")
let str3 = "Swift 스위프트"
println("length of str3: \(countElements(str3))")
//문자열의 자료형이 NSString 경우는 countElements함수를 사용할 없다
// 경우에는 length속성을 사용한다
let str4:NSString = "Swift Language"
println("length of str4: \(str4.length)")

//문자열 순회
for ch in str2 {
    println(ch)
}

//문자열 비교(==연산자 사용)
let lhs = "Apple Swift Language"
let rhs = "Apple Objective-C Language"
if(lhs == rhs) {
    println("equal")
} else {
    println("not equal")
}
//true 출력된다. 프리픽스가 있는 경우
if lhs.hasPrefix("Apple") {
    println("has prefix")
}
//false 출력된다. 대소문자가 다르기 때문
if lhs.hasSuffix("language") {
    println("has suffix")

}

애플의 새로운 개발언어 Swift - 옵셔널#5

// Playground - noun: a place where people can play

import UIKit

//Nil Coalescing연산자는 이항 연산자로 a ?? b 같은 형태로 사용한다
//왼쪽 피연산자에는 욥셔널 형식의 데이터 또는 표현식이 오고
//오른쪽에는 왼쪽 피연산자가 nil 경우 리턴할 기본값 또는 표현식이 온다.
func getUserNameFromDB(id: Int) -> String? {
    if(id<=0) {
        return nil
    }
    
    return "James"
}

var james = getUserNameFromDB(123) ?? "John doe"
var someone = getUserNameFromDB(-1) ?? "John doe"

println(james)
println(someone)

//옵셔널 속성을 가진 클래스 
class Contact {
    var address:String?
    var tel:String?
    var email:String?
}

class Person {
    var contact: Contact?
}

//이런 경우 옵셔널 바인딩을 통해 안전하게 접근해야 한다.
let p = Person()
if let contact = p.contact {
    if let email = contact.email {
        println(email)
    }
    else {
        println("nil email")
    }
} else {
    println("nil contact")
}

//이런 경우 너무 불편하므로 옵셔널 체이닝 기능을 지원한다
let p2 = Person()
var email2 = p2.contact?.email?
println(email2)

//옵셔널 체이닝과 쓰기(실패한 경우)
p2.contact?.email? = "kim@naver.com"
if let email = p.contact?.email? {
    println(email)
} else {
    println("nil email")
}

//이번에는 Contact2 email 값이 초기화 되어 있었기 때문에 성공했다.
class Person2 {
    var contact:Contact2?
    init() {
        contact = Contact2()
    }
}

class Contact2 {
    var address:String?
    var tel:String?
    var email:String? = "N/A"
}

let p3 = Person2()
p3.contact?.email? = "kim@daum.net"
if let email = p3.contact?.email? {
    println(email)
}

//옵셔널 형식으로 자동 변경
//옵셔널 체이닝에서 마지막 요소가 옵셔널이 아닌 경우
class Contact3 {
    var address:String?
    var tel:String?
    var email:String = "lee@daum.net"
}
class Person3 {
    var contact:Contact3?
    init() {
        contact = Contact3()
    }
}
//옵셔널 체이닝의 결과로 리턴되는 값을 자료형은 항상 옵셔널 형식이다
//그래서 마지막 부분에 있는 email 자료형이 String이지만 실제로 리턴되는 
//값은 String? 된다.
let p4 = Person3()
let email = (p4.contact?.email)!
if let email = p4.contact?.email {
    println(email)
}



애플의 새로운 개발언어 Swift - 옵셔널 #4

// Playground - noun: a place where people can play

import UIKit

//swift에서 nil값을 가질 있는 참조 형식과 형식을 옵셔널 형식이라고 한다.
//swift에서 Int? Int 서로 다른 형식이다. 일반 형식과 옵셔널 형식을 
//엄격하게 구분한다.
var optionalNum:Int? = nil
var str:String? = "hello"
str = nil
str = "new value"
str = nil

//Forced Unwrapping
//swift 참조형식과 값형식은 항상 유효한 값을 가지기 때문에 값의 존재여부를 별도로 
//확인하지 않고 사용한다.
//그러나 옵셔널 형식은 반드시 if문을 통해 값의 존재여부를 확인한 사용해야 한다
//여기서 사용된 ! 강제추출 연산자라고 부른다.
var userName:String? = "전우치"
if userName != nil {
    println("USER: \(userName!)")
}

//옵셔널 형식의 유효성을 확인하고 값을 추출하는 작업이 반복되는 경우에는 불필요한 코드의
//양이 늘어나고 지루한 작업이 있다
//옵셔널 형식이 항상 유호한 값을 가지는 경우에는 자료형 뒤에 물음표(?) 대신 느낌표(!)
// 붙여서 암시적으로 추출되는 옵셔널 형식(Implicitly Unwrapped Options)으로 
//선언할 있다
//암시적으로 추출한다고 선언됟어 있어서 추출할 ! 붙이지 않아도 된다.
var userName2:String! = "박문수"
println("USER: \(userName)")

func getUserName() -> String {
    return "홍길동"
}








애플의 새로운 개발언어 Swift - 튜플 #3

개인적으로 파이썬 과정을 만들면서 재미있게 접했던게 튜플인데 요즘 
많은 언어에서 지원한다. 

// Playground - noun: a place where people can play

import UIKit

let member:(Int, String, String, String) = (1, "전우치", "서울", "010-222-3333")
let result:(Bool, String) = (true, "작업이 완료됨")

println(member)
println(result)

// 요소에 접근할 경우
let memberId = member.0
let memberName = member.1
let fetchResultMessage = result.1

//_문자로 특정 요소 무시하기
let (id, name, _, _) = member
println("id \(id) : \(name)")

//튜플의 요소에 이름을 지정하기 
let member2 = (id:1, name:"이순신", address:"서울", phone:"010-222-3333")
let result2 = (isSuccess:true, message:"작업을 완료했음")

let memberId2 = member2.id
let memberName2 = member2.name

let fetchResult2 = result2.message

애플의 새로운 개발언어 Swift - 연산자 #2

import UIKit

var width = 1024
var height = 768

//if width = height {
//    println("잘못된 코드")
//}

//반드시 아래와 같이 == 사용해야 한다.
if width == height {
    println("잘못된 코드")
}

//오버플로우, 언더플로우가 발생하면 에러가 난다
var num:Int = Int.max
//var overflowNum:Int = num + 1

num = Int.min
//var underflowNum:Int = num - 1

//오버플로우를 허용하지 않기 때문에 컴파일 오류가 발생하지만 아래와 같이
//오버플로우 연산자를 사용하면 컴파일 오류 없이 정상적으로 실행된다
var num2:Int = Int.max
var overflowNum: Int = num2 &+ 1

num = Int.min
var underflowNum:Int = num &- 1

//나머지 연산자는 정수 뿐만 아니라 실수에 대한 나머지 연산도 지원한다
var result = 8 % 2.5
println(result)

//swift 2개의 범위 연산자를 제공한다.
// closed range operator
for i in 0...5 {
    println(i)
}

//half-open range operator 
for i in 0..<5 {
    println(i)
}

//범위 연산자의 시작값은 반드시 종료값보다 작거나 같아야 한다.
//감소하는 범위는 reverse함수를 사용한다.
for i in reverse(0..<5) {
    println(i)
}



애플의 새로운 개발언어 Swift - 변수와 상수 사용 #1

우선은 xCode 6.1이 필요합니다. 맥에 설치한 후에
Playground프로젝트로 만들면 쉽게 연습할 수 있습니다.

 // Playground - noun: a place where people can play

import UIKit


var str:NSString = "hello"
var num:Int = 0
var frame:CGRect = CGRectMake(0, 0, 100, 100)

//상수는 let키워드를 사용한다
let str2 = "hello"
let num2:Int = 0

//변수와 상수는 초기화 하고 사용해야 한다
//let condition = false
//var num: Int
//
//if condition {
//    num = 100
//}

var a = 10
var b = 20
var msg = "hello swift"
println("\(msg)\n\(a) + \(b) = \(a+b)")

//정수형의 자료 범위 확인
//int, uint 플랫폼에 따라 32비트 또는 64비트의 크기를 가진다
var max = Int.max
var min = Int.min
println(max)
println(min)

var max2 = UInt.max
var min2 = UInt.min
println(max2)
println(min2)

//진법을 위한 지시자 0b 이진수 앞에, 0o 8진수, 0x 16진수 
//전부 10 나타낸다.
var decimal = 10
var binary = 0b1010
var octal = 0o12
var hexadecimal = 0xa

//숫자의 가독성을 높이기 위한 방법으로 _ 사용하기도 한다.
var numPrice = 1000000000
var price2 = 1_000_000_000

//실수형은 float double 제공한다.
var temperature:Float = 27.5
var weight:Double = 72.1234

//swift 참과 거짓을 나타내는 bool형식으로 true, false외에는 허용하지 않는다
//YES, 1, NO, 0 이상 불린값으로 사용되지 않는다
var isValide = true
var hasUserInfo:Bool = false


//형변환 
var foo:Int32 = 1000000
var bar:Int64 = 0
//bar = foo  //다른 형식으로 담으려는 경우 에러 발생(명시적으로 형변환해야 한다)
//swift에서는 다른 자료형으로 변환하기 위해서는 값의 크기나 유실 가능성에 관계없이
//명시적으로 형변환을 해야 한다.
bar = Int64(foo)


//자료형에 새로운 이름을 붙을 typealias라는 키워드를 사용한다
//Objective-C typedef 대치한다.
typealias CGFloat = CDouble


중국 유니트리 회장의 인터뷰 - 중국 유니트리 회장 "이르면 2~3년 내 '로봇 챗GPT' 시대 온다"

2030년정도가 되면 정말 대중화의 시기가 올 것 같습니다. 앞으로 4년이 중요하네요. ㅎㅎ   https://www.youtube.com/watch?v=AoGBLY1hF00