Swift 프로그래밍 입문 2

6장 컬렉션 타입

/* 컬렉션 타입*/
// 빈 Int Array
var integers: Array<Int> = Array<Int>()
integers.append(1)
// 에러가 발생함 integers.append(101.1)
integers.contains(100)
// 0 번 index 요소를 삭제
integers.remove(at: 0)
//integers.removeLast()
//integers.removeAll()
integers.count
var doubles: Array<Double> = [Double]()
var strings: [String] = [String]()
var charactters: [Character] = []
let immutableArray = [1, 2, 3]
//불변 array immutableArray.append(4)

// Key가 String 타입 Value가 Any인 빈 Dictionry
var anyDictionary: Dictionary<String, Any> = [String:Any]()
anyDictionary["someKey"] = "value"
// key 삭제
anyDictionary.removeValue(forKey: "anotherKey")
anyDictionary["someKey"] = nil
let emptyDictionary: [String: String] = [:]
let initalizedDictionary: [String: String] = ["name": "kahee", "geneder": "female"]
// 불확실성 때문에 오류가 생김 name이란 key가 없을수도 있기 때문
//let someValue: String = initalizedDictionary["name"]

//Set 은 축약형이 없음
var integerSet: Set<Int> = Set<Int>()
integerSet.insert(1)
integerSet.contains(2)
integerSet.remove(100)

let setA: Set<Int> = [1,2,3,4,5]
let setB: Set<Int> = [3,4,5,6,7]

let union: Set<Int> = setA.union(setB)
let sortedUnion: [Int] = setA.sorted()
let intersection: Set<Int> = setA.intersection(setB)
let subtracting: Set<Int> = setA.subtracting(setB)

7장, 8장 함수

func 함수이름(매개변수1이름: 타입, 매개변수2이름: 타입) -> 반환타입 { 함수 구현부 return 반환값 }

//7장 함수

// 리턴이 없는경우
func printMyName(name:String) -> Void{
    print(name)
}
func maximumInttegerValue() -> Int {
    return Int.max
}
printMyName(name: "kahee")

//8장 고급함수
func greeting(friend: String, me: String = "KAHEE"){
    print("Hello \(friend)!")
}

// 전달인자 레이블
// 함수를 호출 할때 매개변수 역할 좀더 명확하게 하거나 함수 사용자의 입장에서 표현하고자 할때 사용
// 위 함수와 함수명은 같지만 다른 함수라고 인식
func greeting(to friend: String, from me:String){
    print("Hello \(friend)! I'm \(me)")
}
greeting(to: "haha", from: "kahee")

// 가변 매개변수 - 함수당 하나만 가질 수 있음
func sayHelloToFriends(me: String, friends:String...) -> String {
    return "Hello \(friends)! I'm \(me)!"
}
print(sayHelloToFriends(me: "kahee", friends: "hi", "nice"))

// 함수의 타입변수
var someFunction: (String, String) -> Void = greeting(to:from:)
someFunction("hi", "kahee")

func runAnother(function: (String, String) -> Void){
    function("jenny", "kahee")
}
runAnother(function: greeting(friend:me:))
runAnother(function: someFunction)

9강 조건문

// 9강 조건문
let someInteger = 100
if someInteger < 100 {
    print("100미만")
} else if someInteger > 100 {
} else {
    print("100")
}

// 조건문은 항상 Bool 타입이 들어와야함
//default 가 무조건 있어야함
switch someInteger {
case 0:
    print("zero")
case 1..<100:
    print("100")
default:
    print("unknown")
}

switch "kahee" {
case "jake", "kahee":
    print("jake")
    fallthrough //break 가 없는 것처럼 mina 까지 실행됨
case "mina":
    print("mina")
default:
    print("unkown")
}

10장 반복문

var integersA = [1, 2, 3]
let people = ["yagom": 10, "eric": 15, "mike": 12]

for integer in integersA {
    print(integer)
}
for (name, age) in people {
    print("\(name): \(age)")
}

while integers.count > 1{
integers.removeLast()
}

repeat {
integers.removeAll()
} while integers.count > 0

11강 옵셔널

  • 옵셔널: 값이 있을 수도 있고 없을 수도 있음
  • 필요한 이유: nil의 기능성을 명시적으로 표현
func someFunction(someOptionalParam: Int?){
    print("hello")
}
func someFunction2(someOptionalParam: Int){
    print("hi")
}

someFunction(someOptionalParam: nil)
//someFunction2(someOptionalParam: nil) 

let optionalValue: Optional<Int> = nil
let optionalValue2: Int? = nil

// 느낌표를 이용한 옵셔널(암시적 추출 옵셔널)
// nil 할당 가능, 기존 변수처럼 사용가능, 그러나 접근할때 런타임 에러 생길 수도 있음

// 물음표를 이용한 옵셔널
var optionalValue3: Int? = 100
switch optionalValue {
case .none:
    print("This Optional variable is nil")
case .some(let value):
    print("Value is \(value)")
}
optionalValue3 = nil
// 기존 변수처럼 사용불가
//optionalValue = optionalValue + 1

12강 옵셔널 추출

// optional binding 값이 있는지 확인 후 가져옴 nil 체크
func pirntName(_ name: String){
    print(name)
}
var myName: String? = nil
//printName(myName) 전달되는 값의 타입이 달라서 오류 발생

// if - let
var myName2: String! = nil
if let name: String = myName2 {
    pirntName(name)
} else {
    print("myName == nil")
}

var myName3: String? = "kahee"
var yourName: String? = nil
//yourName 에 nil이 할당되어서 실행되지 않음
if let name = myName3, let friend = yourName{
    print("\(name) and \(friend)")
}

// Force Unwrapping 옵셔널 강제추출, 추천하지 않은 방식
func printName2(_ name: String) {
    print(name)
}
var  name: String? =  "kahee"
printName2(name!) // 강제로 가져옴 물음표 옵셔널을 없앰
name = nil
print(name) // 값이 없어서 런타임 오류 발생