레이블이 공부 - Swift인 게시물을 표시합니다. 모든 게시물 표시
레이블이 공부 - Swift인 게시물을 표시합니다. 모든 게시물 표시

2016년 5월 18일 수요일

Swift - optional 에서 ! 와 ? 사용법

이후 사용할 때 확정형 선언은 "!"
아직 nil 이 아니라는 확신이 없으면 "?"

var resultInt:Int

var optionalWithSuspicious:Int?
optionalWithSuspicious = 3
print(optionalWithSuspicious)     ‘Optional(3)’
resultInt = optionalWithSuspicious!+3

var optionalWithSure:Int!
optionalWithSure = 3
print(optionalWithSure)               ‘3’

resultInt = optionalWithSure+3


Swift - main story board 활용한 화면 전환 tip

xcode 에는 UI 디자인을 위한 main story board 라는 툴을 제공한다.

화면 전환은 2가지 방법이 존재한다.

1. Modal Popup
2. Push


modal popup 세그메뉴 present modally
push 세그메뉴 show (navigation controller 필히 있어야 함)


참조 github

https://github.com/GlennHKim/iphone_view_transition


2016년 5월 17일 화요일

Swift - struct 와 class 로 배워 보는 Call by Value / Call by Reference


// 스트럭트
struct Task {
    var title:String
    var time:Int?
}

var callTask = Task(title: "Call to randy", time: 10*60)
var reportTask = Task(title: "Report to boss", time: nil)

var todayTask : [Task] = []
todayTask += [callTask, reportTask]

todayTask[1].time = 15*60
callTask.title = "Call to toby"

print("today task = \(todayTask) \r\n callTask = \(callTask)")


// 클래스
class TaskClass {
    var title:String
    var time:Int
    
    init(title:String, time:Int){
        self.title = title
        self.time = time
    }
}

var callTask2 = TaskClass(title: "Call to randy", time: 10*60)
var reportTask2 = TaskClass(title: "Report to boss", time: 10*80)

var todayTask2 : [TaskClass] = []
todayTask2 += [callTask2, reportTask2]

todayTask2[1].time = 15*60
callTask2.title = "Call to toby"


print("today task = \(todayTask2[0].title) \r\n callTask = \(callTask2.title)")




실행 결과는

today task = [Task(title: "Call to randy", time: Optional(600)), Task(title: "Report to boss", time: Optional(900))] 
 callTask = Task(title: "Call to toby", time: Optional(600))
today task = Call to toby 
 callTask = Call to toby

Swift - Protocol 기본

protocol EngineProtocol {
    var name:String { get set }   // name 이라는 이름을 갖고 get/set 이 가능 한 property
    func startEngine()
    func stopEngine()
}

//class NewEngine: Engine, EngineProtocol {   // Objective-c와 다르게 상속과 protocol 준수를 선언하는 부분이 동일
class NewEngine: EngineProtocol {
    var name:String
    
    init(){
        name = "New Engine"
    }
    
    func startEngine() {
        print("New Start Engine!")
    }
    
    func stopEngine() {
        print("New Stop Engine")
    }
    

}

Swift - Class 기본

import Foundation

class Engine{
    var name:String
    
    // 클래스 초기화 함수
    init(initName:String){
        self.name = initName
    }
    
    init(){
        self.name = "Normal Engine"
    }
    
    func startEngine(){
        print ("Start Engine!")
    }
    
    func stopEngine(){
        print("Stop Engine")
    }
}

var myEngine = Engine(initName:"8기통")

class Tire{
    let name:String
    
    init(initName:String){
        name = initName
    }
}

var myTire = Tire(initName: "신발보다 싼 타이어")

class Car{
    var engine:Engine
    var tire:Tire
    
    init(){
        engine = Engine(initName: "8기통 엔진!")
        tire = Tire(initName: "금호 타이어")
    }
    
    func Start() -> Bool{
        engine.startEngine()
        return true
    }
}

let car = Car()
car.engine.name
car.tire.name
let result = car.Start()

print(myEngine.name + " " + myTire.name)

class SuperEngine: Engine{
    var year:String     // 저장 형 Property
    
    var info:String{    // 연산 형 Property
        get {
            return name + year
        }
        set {
            let index = newValue.endIndex.advancedBy(-4)    // newValue 는 setter 의 인자로 들어오는 값을 담는 변수
            year = newValue.substringFromIndex(index)
            name = newValue.substringToIndex(index)
        }
    }
    
    override init() {
        year = "0000"
        super.init()
        name = "Super Engine"
//        super.name = "Super Engine"
//        self.name = "Super Engine"
    }
    
    func speedUp(){
        print("Speed Up!")
    }
}

car.engine = SuperEngine()
car.engine.name

// 타입 캐스팅
var superEngine = car.engine as! SuperEngine
superEngine.speedUp()
superEngine.info
superEngine.info = "Hyper Engine2016"
superEngine.info
superEngine.name

superEngine.year

Swift - for 사용

let theRatings = [1,2,3,4,5]

// 가장 기본 적인 for 문
for rate in theRatings{
    print(" 제 점수는요~ \(rate)")
}

// ... 연산자를 이용한 for 문
for i in 0...7 {
    print("\(i+1)번째 반복 중")
}

// ..< 연산자를 이용한 for 문
for i in 0..<7 {
    print("7번 반복")
}

// 굳이 증분 값을 참조하지 않는 경우 '_' 이용
for _ in 0...7 {
    print("8번 반복")

}

Swift - func 함수 선언 지시자


func getValue() -> Double {
    return 3.31
}

getValue()


func getTuple(strName:String, withAge:Int) -> (name:String, age:Int){
    return (strName, withAge)
}

getTuple("Jsson lee", withAge: 39).name


func myNewFunc(tuple:(name:String, age:Int)) -> String {
    return tuple.name
}

myNewFunc(("nicegood", 13))

func funcWithoutReturn() {
    print("this is non-returnable function")
}

funcWithoutReturn()

func funcWithDefaultParameter(inputName:String="JOHN DOE", age:Int) -> (killCount:Int, lastAccessPoint:String) {
    return (age, "Kill House")
}


funcWithDefaultParameter("hello", age: 3)

var newDate = NSDate()

func getAveList(scores:Int..., total:Double) -> Double {
    var total = 0
    for p in scores{
        total += p
    }
    return Double(total)/Double(scores.count)
}

func getAve(scores:[Int]) -> Double {
    var total = 0
    for p in scores{
        total += p
    }
    return Double(total)/Double(scores.count)
}

getAve([0,0,0,1,2,3,4])
getAveList(1,2,3,4, total:3.1)


var value = 12

func testFun(var param:Int) -> Int {
    param += 1
    return param
}

print(testFun(value))
print(value)

var value2 = 12

func testFun2(inout param:Int) -> Int {  // inout 지시자는 원형타입의 파라미터 주소값을 넘기는 형태로 함수 실행토록 해줌
    param += 1
    return param
}

print(testFun2(&value2))

print(value2)

Swift - Optional 개론

1. Optional 이란?
 '값이 없을 수 있는 가능성' 을 다루는 개념
 c/c++ 혹은 java 등에서 메모리주소 혹은 객체의 포인터를 다루는 언어에서 null / nil 을 다루는 데 문제가 많음.

2. Optional 선언

var ratings:[Int]? = nil

var optInt:Int?
var optStr:String?

var optArr:[String]?

 선언할 때 '?'를 써 넣어 주면 Optional로 되고 이 변수에다가는 nil을 할당할 수 있다.
 혹은 선언만 하면 해당 변수는 nil로 세팅 된다.

3. Optional의 사용법

// 안되는 예
// 옵셔널 값을 반환 함. Int("ABC")의 경우 오류가 발생할 걸 대비하기 위해
var getInt = Int("123")

var b = 10 + getInt // 컴파일 오류, getInt 가 Optional로 래핑되었기 때문에

// 되는 예1 - 강제 언래핑
var b = 10 + getInt! // 실제 언래핑 시점에 값이 여전히 nil인 경우 런타임에러

// 되는 예2 - 좀 더 부드러운 사용
ratings = [1,2,3,4]

if let theRatings = ratings {
    for rate in theRatings{
        print(" 제 점수는요~ \(rate)")
    }

}