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)


댓글 없음:

댓글 쓰기

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

Xcode 26의 새로운 기능들

 애플의 AI준비에 대한 골든타임이 지나가고 있다는 말이 많이 들립니다. ㅎㅎ  애플의 그동안의 패쇄적인 환경을 생각하면 온디바이스AI나 LLM환경에서 다소 아쉬운 부분이 많이 있습니다. 다른 빅테크들과 전혀 다른 방향의 목소리를 내고 있어서 좀 우려...