2016년 6월 30일 목요일

Swift 3.0에서 변경된 사항들입니다. xCode 8.0 과 iOS 10.0에서 테스트한 내용들입니다.

Swift 3.0에서 변경된 부분입니다. 아직 정리중입니다. 
정리된 글들이 올라오고 있어서 일부 번역해서 올려봅니다.


1.   ++, --연산자는 더 이상 지원되지 않는다. +=, -=을 사용한다.


        var i = 0
        //다음의 연산자는 제거되었다.
        //i++
        //i--
       
        //아래와 같이 접근해야 한다.
        i += 1
        i -= 1
        print("i: \(i)")
       
2.   C-style for 루프는 사용할 없다.
//        for(var i=1;i<=10;i++)
//        {
//            print(i)
//        }
       
       //아래와 같이 접근해야 한다.
        for i in 1...10 {
            print(i)
        }
       
        (1...10).forEach {
            print($0)
        }

3.   함수의 매개변수 앞에 더 이상 var를 붙일 수 없다.
//function parameter
    //매개변수 앞에  var 붙이는 것은 이상 사용할 없다.
//    func gcd(var a:Int, var b:Int) -> Int {
//        if (a==b) {
//            return a
//        }
//
//        repeat {
//            if (a>b) {
//                a = a - b
//            } else {
//                b = b - a
//            }
//        } while(a != b)
//
//        return a
//    }

    //아래와 같은 코드로 변경해야 한다.
    func gcd(a:Int, b:Int) -> Int {
        if (a == b) {
            return a
        }
       
        var c = a
        var d = b
       
        repeat {
            if (c > d) {
                c = c - d
            } else {
                d = d - c
            }
        } while (c != d )
       
        return c
    }

4.   함수 호출 시에 모든 매개변수명을 라벨형태로 호출해야 한다.
//함수를 호출할 라벨을 붙이는 부분도 변경되었다.
//초보자들에게 혼란이 오기 때문에 첫번째 라벨부터 붙이도록 변경되었다.
//기존 Swift 2.2 스타일
//gcd(8, b: 12)
       
//Swift 3.0스타일
gcd(a: 8, b: 12)
     
//기존 작성했었던 많은 함수에서 혼란이 있기 때문에
애플이 준비한 _ 첫번째 매개변수 앞에 붙여서 해결할 있다.
//func gcd(_ a:Int, b:Int) -> Int


5.   더 이상 Selector는 문자열로 처리되지 않는다.
import UIKit
import XCPlayground

class Responder: NSObject {
    func tap() {
        print("Button pressed")
    }
}

let responder = Responder()

let button = UIButton(type: .system)
button.setTitle("Button", for: [])
//기존에 동작했던 코드
//button.addTarget(responder, action:"tap", forControlEvents: .TouchUpInside)
//#selector 변경됨
button.addTarget(responder, action: #selector(Responder.tap), for: .touchUpInside)
button.sizeToFit()
button.center = CGPoint(x:50, y:25)

let frame = CGRect(x:0, y:0, width:100, height:50)
let view = UIView(frame:frame)
view.addSubview(button)
//XCPlaygroundPage.currentPage.liveView = view

6.   KVC(Key Value Coding)KVO(Key Value Observing)에서 변경된 부분
Key-path스트링은 #keyPath()표현식으로 변경되었다.
class Person: NSObject {
    var name: String = ""
   
    init(name:String) {
        self.name = name
    }
}

let me = Person(name: "Cosmin")
//기존에 사용하던 코드
//me.valueForKeyPath("name")
//Swift 3.0에서 변경된 코드
me.value(forKeyPath: #keyPath(Person.name))

7.   NS Prefix가 삭제되었다.
//기존에 사용하던 코드
//let file = NSBundle.mainBundle().pathForResource("tutorials",
//        ofType: "json")
//let url = NSURL(fileURLWithPath: file!)
//let data = NSData(contentsOfURL: url)
//let json = try! NSJSONSerialization.JSONObjectWithData(data!,
//        options: [])
//print(json)

//변경된 코드
//Swift 3.0 코드
let file = Bundle.main().pathForResource("tutorials", ofType: "json")
let url = URL(fileURLWithPath: file!)
let data = try! Data(contentsOf: url)
let json = try! JSONSerialization.jsonObject(with: data)
print(json)

8.   M_PI 가 아닌 .pi 로 호출 한다.
//기존 스타일은 아래와 같은 코드
let r = 3.0
let circumference = 2 * M_PI * r
let area = M_PI * r * r

//아래의 코드로 접근 가능
print(Float.pi)
print(Double.pi)
print(CGFloat.pi)
let r2 = 3.0
let circumference2 = 2 * Double.pi * r
let area2 = Double.pi * r * r

9.   GCD에서 변경된 부분
//GCD
//기존 Swift 2.2 스타일
//let queue = dispatch_queue_create("Swift 2.2", nil)
//dispatch_async(queue) {
//    print("Swift 2.2 queue")
//}

//Swift 3.0스타일
let queue = DispatchQueue(label: "Swift 3")
queue.async {
    print("Swift 3 queue")
}

10. Core Graphic에서 변경된 부분

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

import UIKit

//기존 Swift 2.2스타일
//let frame = CGRect(x:0, y:0, width:100, height:50)
//
//class View:UIView {
//    
//    override func drawRect(rect:CGRect) {
//        let context = UIGraphicsGetCurrentContext()
//        let blue = UIColor.blueColor().CGColor
//        CGContextSetFillColorWithColor(context, blue)
//        let red = UIColor.redColor().CGColor
//        CGContextSetStrokeColorWithColor(context, red)
//        CGContextSetLineWidth(context, 10)
//        CGContextAddRect(context, 10)
//        CGContextAddRect(context, frame)
//        CGContextDrawPath(context, .FillStroke)
//    }
//}
//
//let aView = View(frame: frame)

//Swift 3.0스타일 
let frame = CGRect(x: 0, y: 0, width: 100, height: 50)

class View: UIView {
    override func draw(_ rect: CGRect) {
        guard let context = UIGraphicsGetCurrentContext() else {
            return
        }
        
        let blue = UIColor.blue().cgColor
        context.setFillColor(blue)
        let red = UIColor.red().cgColor
        context.setStrokeColor(red)
        context.setLineWidth(10)
        context.addRect(frame)
        context.drawPath(using: .fillStroke)
    }
}
let aView = View(frame: frame)


댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

제 유튜브 채널에 꾸준하게 영상을 올리고 있습니다. ㅎㅎ 2025년에는 100개 정도의 영상을 올릴 생각입니다.

  2024년에 시작한 것이 유튜브 채널입니다. 주로 파이썬 프로그래밍에 관련된 영상들을 올릴 생각입니다. ㅎㅎ 제가 집필한 책을 기본으로 해서 파이썬의 기본 문법, 라이브러리, 챗GPT와의 연동등을 주로 올리려고 합니다. 현재 20개 정도 영상을 ...