post list

2015년 3월 28일 토요일

Swift(스위프트) 강좌 : 빠르게 시작하기 5

함수(Functions)

상수(Constant)와 가변(Variable) 파라메터


함수의 파라미터들은 기본적으로 상수들입니다. 
그런데 파라미터를 변수로 사용하고 싶을때는  파라미터 이름 앞에 var을 붙여주면 됩니다.
func alignRight(var stringStringcountIntpadCharacter) -> String {
  let amountToPad = count - countElements(string)
  if amountToPad < 1 {
  return string
}
  let padString = String(pad)
   for _ in 1...amountToPad {
      string = padString + string
}
  return string
}
  let originalString = "hello"
  let paddedString = alignRight(originalString10"-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello"


가변파라미터는 오직 함수 자신 내부에서만 변경될수 있습니다. 
값을 변경하고 함수 호출이 종료된 후에도 계속 값이 유지되길 원한다면 inout 키원드를 사용합니다.
다음 예제는 입력된 두 값을 교환합니다.
func swapTwoInts(inout aIntinout bInt) {
  let temporaryA = a
  a = b
  b = temporaryA
}


클로저(Closures)


클로저는  objective-c 나 C 에서 블록(blocks)이랑 비슷합니다. 


클로저 표현 식은 다음과 같습니다.

{ (parameters) -> return type in
    statements
} 


블록을 쓰면  굳이 함수를 선언하지 않고  비교적 긴 코드를 캡슐화할 수 있습니다. 
예를 들어 다음과같이 정렬 기능을 하는 코드가 있습니다.
let names = ["Chris""Alex""Ewa""Barry""Daniella"]
      func backwards(s1Strings2String) -> Bool {   return s1 > s2 } var reversed = sorted(namesbackwards) // reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

      정렬 기능의 함수를 정의할 수 도 있지만 클로저를 사용하면 다음과 같이 
      입력 파라미터에 즉시 코드를 작성가능합니다.
      reversed = sorted(names, { (s1Strings2String) -> Bool in return s1 > s2 } )   



      열거형(Enumerations)


      열거형의 표현식입니다.
      enum SomeEnumeration {
        // enumeration definition goes here
      }
       

      예를 들면 이런식으로 사용 됩니다.
      enum CompassPoint {   case North   case South   case East   case West }
        enum Planet {   case MercuryVenusEarthMarsJupiterSaturnUranusNeptune }

        열겨형을 스위치 문과 같이 쓰기
        var directionToHead = CompassPoint.West

        directionToHead 변수에 CompassPoint 타입이 초기화 되었습니다. 그럼  이 변수는 타입추정에 의해 다음부터 CompassPoint 를 생략하고 다른 값을 대입할 수 있습니다.

        directionToHead = .South
        switch directionToHead {
          case .North:
            println("Lots of planets have a north")
          case .South:
            println("Watch out for penguins")
          case .East:
            println("Where the sun rises")
          case .West:
            println("Where the skies are blue")
        }
        // prints "Watch out for penguins"

        연관 값(Associated Values)

        열거형을 이용해 값을 저장하는 것도 가능합니다.
        실생활에서 바코드는 2가지 타입이 사용 됩니다. 
        UPC-A바코드를 3개의 숫자 튜플로 저장하고 QR코드는 문자열로 저장하겠습니다. 
        enum Barcode {
          case UPCA(IntIntIntInt)
          case QRCode(String)
        }

        그럼 이제 2가지 방식으로 값을 저장할 수 있습니다.
        var productBarcode = Barcode.UPCA(885909512263)
        productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

        그리고 요딴식으로 사용합니다.
        switch productBarcode {
          case .UPCA(let numberSystemlet manufacturerlet productlet check):
            println("UPC-A: \(numberSystem)\(manufacturer)\(product)\(check).")
          case .QRCode(let productCode):
            println("QR code: \(productCode).")
        }
        // prints "QR code: ABCDEFGHIJKLMNOP."

        원시값(Raw Values)

        지금까지 열거형 멤버들에 값을 저장하는 방법을 배웠습니다. 
        다른 방법으로 기본값들로 미리 채워 질 수 있습니다.
        enum ASCIIControlCharacterCharacter {
          case Tab = "\t"
          case LineFeed = "\n"
          case CarriageReturn = "\r"
        }

        이렇게 열거형 이름 뒤에 변수 타입을 적어 주면 됩니다.
        enum PlanetInt {
          case Mercury = 1VenusEarthMarsJupiterSaturnUranusNeptune
        }


        이경우 Venus = 2 , Earth = 3 .... 이렇게 자동 증가 되어 값이 설정됩니다.




        2015년 3월 21일 토요일

        Swift(스위프트) 강좌 : 빠르게 시작하기 4


        함수(Functions)


        함수의 정의

                                                             

        func HappyOri(myName : String) -> String {    
            let greeting = "Happy" + myName            
            return greeting 
        }        

        함수를 정의할때는 func 먼저 적고 함수 이름을 적습니다. HappyOri가 함수 이름입니다.그리고 괄호안에 입력 파라미터를 적고  -> 다음에 반환타입을 적어줍니다. 

        당연히 복수의
        입력 파라미터를 가질 수 있고  튜플을 이용해 복수의 반환 값을 가질 수 있습니다



        복수의 반환값을 가지는 함수


        func minMax(array: [Int]) -> (min: Int, max: Int) {
            var currentMin = array[0]
            var currentMax = array[0]
            for value in array[1..<array.count] {
                if value < currentMin {
                    currentMin = value
                } else if value > currentMax {
                    currentMax = value
                }
            }
            return (currentMin, currentMax)
        }


        다음과 같이 반환된 값을 사용할 수 있습니다.


        let bounds = minMax([8, -62109371])
        println("min is \(bounds.min) and max is \(bounds.max)")
        // prints "min is -6 and max is 109"


        외부 파라미터 이름(Extrernal Prameter Names)

        함수를 정의 할때 외부 파라미터 이름을 지정할 수 있습니다.
        기존 내부 파라미터 이름 앞에 외부 파라미터이름을 넣을 수 도 있고 # 을 이용해 내부 파라미터이름과 외부 파라미터 이름을 합칠 수 도 잇습니다.
        // 내부 파라미터 이름
        func join(s1: String, s2: String, joiner: String) -> String {
            return s1 + joiner + s2
        }
        // 외부 파라미터 이름
        func join(string s1: String, toString s2: String, withJoiner joiner: String)
            -> String {
                return s1 + joiner + s2
        }
        //단축 외부 파라미터 이름
        func join2(#string: String, #toString: String, #withJoiner: String) -> String {
            return string + withJoiner + toString
        }



        외부 파라미터를 쓰지 않으면 함수를 사용할때 입력 파라미터의 목적이 불분명해질 수 있습니다.
        그래서 외부 파라미터를 쓰면 편한경우가 많습니다.
        다음은 위의 3개의 함수를 사용할때의 모습입니다.  






        기본(default) 파라미터 값

        함수의 파라미터에 기본값을 설정할 수 있습니다. 
        기본값을 설정후  함수사용시 값을 입력하지 않으면  기본값을 이용합니다.
        이때 외부 이름을 부여하지 않은 파라미터에 대해 자동으로 외부 파라미터이름을 제공합니다.
        # 를 사용한 것과 같은 효과를 가집니다.
        func plus(num : Int = 0 , num2 : Int = 0 ) -> Int {
            return num + num2
        }
        plus(num: 2, num2: 2)
        //return is 4
        plus()
        //return is 0


        가변 개수(Variadic) 파라미터

        임의의 개수를 입력받는 함수를 정의하기위해 입력 파라미터 타입뒤에 마침표 세개(...)  삽입하면 됩니다. 함수 내부에 전달된 값은 적절한 타입의 배열(Array)로 만들어 집니다.
        func arithmeticMean(numbers: Double...) -> Double {
            var total: Double = 0
            for number in numbers {
                total += number
            }
            return total / Double(numbers.count)
        }
        arithmeticMean(12345)
        // returns 3.0, which is the arithmetic mean of these five numbers
        arithmeticMean(38.2518.75)
        // returns 10.0, which is the arithmetic mean of these three numbers


        2015년 2월 15일 일요일

        Swift(스위프트) 강좌: 빠르게 시작하기 3

        딕셔너리(Dictionaries)


        스위프트의 딕셔너리는 특정한 타입의 키와 그에 따른 값을 저장한다.  
        Objective-C NSDictionary NSMutableDictionary 클라스와는 다릅니다.
        NSDictionary와 NSMutableDictionary 클라스는 어느 종류의 객체든 키와 값으로 저장이 가능한 반면 그 저장된 객체의 속성에 대한 어떠한 정보도 제공하지 않습니다. 

        딕셔너리 표현식 (Dictionary Literals)


        1
        2
        3
        4
        5
        6
        7
        // full form
        var airports: Dictionary<String , String
        = ["YYZ" : "Toronto Pearson" , "DUB" : "Dublin"]
        // short form
        var number: [ Int : String] = [1 : "one"2"two" ]
        // shorter from
        var city = ["seoul" : 02 , "daegu" : 053 ]
        cs

        딕셔너리의 접근 및 수정 Accessing and Modifying a Dictionary

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        //개수 확인
        println("The airports dictionary contains \(airports.count) items")
        // 비었는지 확인
        if airports.isEmpty {
            println(" The airports dictinary is empty")
        }
        // 추가
        airports["LHR"] = "London"
        // 수정
        airports["LHR"] = "London Heathrow"
        // 수정 : 메소드를 사용
        // return 값은 밸류 타입에 해당하는 Optinal 값
        if let oldValue = airports.updateValue("Dublin Airport", forKey: "DUB") {
            println("The old value for DUB was \(oldValue).")
        }
        // 삭제 
        airports["YYZ"] = nil
        // 삭제 : 메소드 사용 
        // return 값은 삭제된 값
        if let removedValue = airports.removeValueForKey("DUB") {
            println("The removed airport's name is \(removedValue)")
        }
        cs

        빈 딕셔너리 만들기 Creating an Empty Dictionary


        1
        var namesOfInteagers = [Int : String]()
        cs


        만약 context에서 이미 타입에 대한 정보를 가지고 있다면  [:] 통해서 빈딕셔너리를 초기화할 수 있습니다.. 


        1
        2
        namesOfInteagers[16] = "sixteen"
        namesOfInteagers = [:]
        cs









        2015년 2월 7일 토요일

        Swift(스위프트) 강좌 : 빠르게 시작하기 2

        옵셔널(Optionals)


        옵셔널은 어떤값이 부재인지를 체크합니다. 옵셔널에 대한 개념은 C나 Objective-c 에서는 없습니다.  

        옵셔널은 다음을 이야기 합니다.
        • 그곳에는 값이 "있다, 그리고 그것은  x와 동일하다. 
        • 그곳에는 값이 전혀"없다"
        다시말해서  변수를 쓰고 싶은데 어플 실행중에 상황에 따라 변수에 값이 없을 수도 있을때 그것을 대처하기 위해 씁니다. 

        선언은 다음과 같이 변수형뒤에 '?' 를 붙입니다.  값이 없을때는 nil 이 들어갑니다.
        변수 선언하고 초기화 하지 않을 경우에는 자동으로 nil 이 들어갑니다.

        1
        2
        3
        4
        5
        6
        var serverResponseCode : Int? = 404
        // severResponseCode contains an actual Int value of 404
        serverResponseCode = nil
        //serverResponseCode now contains no value
        var surveyAnswer: String
        cs


        if문과 강제 언랩핑(If Statements and Forced Unwrapping)

        옵셔널이 값을 가지고 있는지 찾기 위해서 if문을 사용할수 있습니다. 

        만약 옵셔널이 확실하게 값을 가진다는것을 알때 변수명 뒤에 '!' 를 붙여 줍니다. 이것을 강제 언랩핑이라고 합니다. 
        만약 강제언랩핑한 변수에 값이 없을경우 런타임 에러가 발생합니다.
        1
        2
        3
        if convertNumber != nil {
            println("convertedNumber has an integer value of \(convertedNumber!).")
        }
        cs

        배열(Arrays)

        스위프트에서 배열은 특정 변수 타입만 저장 할 수 있습니다.. objective-c 의 NSArray 와 NSMutableArray 클래스와 다릅니다. 따라서 Int 형 타입 배열을 생성했다면 int 외에는 저장이 불가능합니다.  

        배열 타입 축약 문법 (Array Type Shorthand Syntax)

        정확한 배열 타입을 정확하게 쓰려면 Array<SomeType> 형태로 해야합니다. 
        축약 형태인 [SomeType] 로 배열을 사용할 수 있습니다.  축약형태로 쓰는걸 권장합니다.

        배열생성은 다음과 같이 합니다. 
        값 타입이 같다면  타입을 명시 하지 않아도 됩니다.
        1
        2
        var shoppingList : [String] = ["Eggs","Milk"]
        var shoppingList2 = ["coffee","water"]
        cs

        배열의 접근 및 수정 Accessing and Modifying an Array

        한꺼번에 코드로 설명합니다.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        //item 개수 확인
        println("The shopping list contains \(shoppingList.count) item.")
        //배열이 비었는지 확인
        if shoppingList.isEmpty {
            println("The shopping list is empty.")
        else {
            println("The shopping list is not empty.")
        }
        //배열 마지막에 추가
        shoppingList.append("Flour")
        shoppingList += ["Baking Powder"]
        shoppingList += ["Chocolate Spread""Cheese""Butter"]
        //배열로 부터 값 찾기 
        var firstItem = shoppingList[0]
        //배열에 값 넣기
        shoppingList[0] = "six eggs"
        // 법위를 지정해서 값을 넣을 수도 있습니다. 바꾸려는 범위가 실제 범위와 달라도 됩니다.
        //4번 - 6번 index 의 값이  4,5번에 banans , apples 로 바뀝니다.
        shoppingList[4...6] = ["Bananas""Apples"]
        //특정 index 값 지우기 그리고 그 값 return
        let mapleSyrup = shoppingList.removeAtIndex(0)
        //마지막 값 지우기 그리고 그 값 return
        let apple = shoppingList.removeLast()
        cs


        배열에서 반복문 사용하기 Iterating Over an Array

        for-in 반복문을 사용하면 배열 안에 모든 값에 접근 가능합니다. 

        인덱스가 필요하다면 enumerate 를 사용해서 배열을 돌릴 수 있습니다. 
        enumerate 함수는 각각의 값과 인덱스를 결합한 튜플을 반환합니다.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        for item in shoppingList {
            println(item)
        }
        // Milk
        // Flour
        // Baking Powder
        // Bananas
        for (index, value) in enumerate(shoppingList) {
            println("Item \(index + 1): \(value)")
        }
        // Item 1: Milk
        // Item 2: Flour
        // Item 3: Baking Powder
        // Item 4: Bananas
        cs

        배열의 생성과 초기화 Creating and Initializing an Array

        초기값 할당 없이 특정 타입을 가진 빈 배열 만들기
        1
        var someInts = [Int]()
        cs


        다음엔 Dictionaries 부터 시작합니다. 최대한 필요한것만 적으려고 하는데 
        은근히 길어지네요 

        2015년 2월 1일 일요일

        Swift(스위프트) 강좌 : 빠르게 시작하기 1

        개발 환경 : Xcode6 ,iOS8

        Swift 는 애플의 새로운 프로그래밍 언어입니다.

        swift 언어를 배우기위해선 Swift reference guide 를 보는 것을 추천하지만 reference guide는 너무 길고 오래걸립니다. 그리고 영어입니다.  이 튜토리얼은 objective-c 같은 객체 지향 언어를 미리 알고있고 익숙하다는 가정하에 swift를 빠르게 배우고 싶은 사람을 위해 만들었습니다.

        이 튜토리얼 내용은 Swift reference guide 기준으로 작성되었습니다.

        Xcode6 를 시작하고 File\New\File... 에서 Playground  파일을 생성합니다.




        전통적으로  새언어를 배울때는  Hello, world 란 구문을 출력해 봐야됩니다.

        1
        println("Hello,world")
        cs
        그럼 오른쪽에 결과를 즉시 볼수 있습니다.
        swift에서는 입/출력이나 문자열을 다루기 위한 함수를 쓰기 위해 분리된 라이브러리를 불러올 필요가 없습니다.  전역 범위에 해당하는 코드는 프로그램의 진입점으로 사용되기 때문에 main 함수도 필요하지 않습니다. 그리고 끝에 세미콜론을 쓸필요도 없습니다. 쓰고 싶으면 써도 됩니다. 

        그리고 상단메뉴에서 View\Assistant Editior\Show Assistant Editor 선택하면 콘솔창을 볼수 있습니다. 

        상수(Constants)와 변수(Variables)


        상수는 let 키워드를 사용하고  변수선언은 var 을 사용합니다.

        1
        2
        3
        4
        let Constats  = 10
        var Variables = 20
        var x = 0.0 , y = 0.0 , z = 2.0 
        let string = "Happy ori"
        cs

        타입명시(Type Annotations)


        상수나 변수를 선언할때 바로 초기화를 할경우 알아서 설정이됩니다.

        1
        var welcomeHappyori : String 
        cs

        타입변환

        1
        2
        3
        let three = 3
        let pointOneFourOneFiveNine = 0.14159
        let pi = Double(three) + pointOneFourOneFiveNine
        cs

        튜플(Tuples) 

        튜플은 여러값들을 하나의 값으로 묶어 줍니다. 여러 값은 각각 동일한 타입일 필요도 없습니다.  이름을 지어줄 수도 있습니다.

        1
        2
        3
        let http404Error = (404"Not Found")
        // http404Error is of type (Int, String), and equals (404, "Not Found")
        let http200Status = (statusCode: 200, description: "OK")
        cs

        각 튜플의 각 내용들은 분리된 상수나 변수로 분해할수 있고 접근도 가능합니다.

        1
        2
        3
        4
        5
        6
        let (statusCode, statusMessage) = http404Error
        println("The status code is \(statusCode)")
        // prints "The status code is 404"
        println("The status message is \(statusMessage)")
        // prints "The status message is Not Found"
        cs

        튜플중 몇개만 필요하다면  "_" 로 무시할 부분을 처리하면 됩니다.

        1
        2
        3
        let (justTheStatusCode, _) = http404Error
        println("The status code is \(justTheStatusCode)")
        // prints "The status code is 404"
        cs

        0으로 시작하는 index number를 통하여 각각의 element value 에 접근 가능합니다.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        println("The status code is \(http404Error.0)")
        // prints "The status code is 404"
        println("The status message is \(http404Error.1)")
        // prints "The status message is Not Found"
        println("The status code is \(http200Status.statusCode)")
        // prints "The status code is 200"
        println("The status message is \(http200Status.description)")
        // prints "The status message is OK"
        cs

        계속....