본문 바로가기
IT/swift

100 days of SwiftUI 시작! Day 0 ~ Day 9

by 가능성1g 2024. 11. 12.
반응형

항상 중도 포기중인 swift 공부를 또! 시작해 봅니다.

이번엔 perplexity에서 물어봤는데 이 사이트를 알려주더라구요. 

또 최근에 읽은 기사에 300개 앱 만들어서 회사탈출한 사람 이야기를 듣고, 열심히 하기로 했습니다.

 

깐바레!

 

https://www.hackingwithswift.com/100/swiftui

 

첫날은 뽐뿌에 차서 달려봅니다.

 

 

Day0. 준비끝

Day1. string 길이 함수는 count

Day2. 머 없음

Day3. enum 선언에 case를 쓰는구나

Day4. 머 없음

Day5. 머 없음

Day6. 아는 내용이지만 루프 돌릴때 1...10  1..<10 직관적인 표현 좋음

Day7. func 펑크가 함수, 튜플로 2개이상 리턴 가능 이름 생략도 가능

Day8. 머없음

 

Day9.  시~~작~~

let sayHello = {
    print("Hi there!")
}

sayHello()

변수에 바로 함수 할당하기

let sayHello = { (name: String) -> String in
    "Hi \(name)!"
}

클로저에는 in 키워드를 사용한다. 한줄 리턴 코딩에는 과감하게 return 키워드 생략 가능

 

func getUserData(for id: Int) -> String {
    if id == 1989 {
        return "Taylor Swift"
    } else {
        return "Anonymous"
    }
}

let data: (Int) -> String = getUserData
let user = data(1989)
print(user)

* 함수선언 for 외부 파라미터명 id 내부파라미터명  리턴값은 String 타입이라고 표기

* data 변수에 함수 타입을 선언하고 할당

* data를 함수같이 쓸수 있다!  data(1989) 특이사항은 외부 파라미터명을 안주고 쓴거!

즉, getUserData(for: 1989) 로 호출해야 하는데 변수에 할당한 함수는 그냥 호출(data(1989)) 한점

 

func captainFirstSorted(name1: String, name2: String) -> Bool {
    if name1 == "Suzanne" {
        return true
    } else if name2 == "Suzanne" {
        return false
    }

    return name1 < name2
}

let captainFirstTeam = team.sorted(by: captainFirstSorted)
print(captainFirstTeam)

배열의 내장함수 sorted에 비교함수를 주면 정렬시 사용이 가능함!

위의 정렬함수(captainFirstSorted)는 Suzanne가 무조건 1등 으로 나오고 나머지는 알파벳순으로 정렬함

 

let captainFirstTeam = team.sorted(by: { (name1: String, name2: String) -> Bool in
    if name1 == "Suzanne" {
        return true
    } else if name2 == "Suzanne" {
        return false
    }

    return name1 < name2
})

합쳐서 쓰기 하지만 이렇게 쓰면 오히려 복잡해 보인다! but  클로저에서 파라미터 타입은 들어올때 정해져있으므로 생략 가능 리턴값도 생략 가능 하다. 그리고 in 키워드 도 생략 가능하고 파라미터들은 $0, $1 ... 로 대체 가 가능하다. 그래서!

 

let captainFirstTeam = team.sorted {
    if $0 == "Suzanne" {
        return true
    } else if $1 == "Suzanne" {
        return false
    }

    return $0 < $1
}

이렇게 쓸 수 있다.  이렇게 활용이 가능할때, 한줄짜리 코딩들을 쓴다고 하면,

let reverseTeam = team.sorted { $0 > $1 }
let tOnly = team.filter { $0.hasPrefix("T") }
let uppercaseTeam = team.map { $0.uppercased() }

역정렬은 더 간단하게 쓸수 있다. 추가로 filter, map 함수를 쓰면 함수내 추가적인 변수를 선언하지 않고 깔끔하게 표현이 가능해 진다.

 

func makeArray(size: Int, using generator: () -> Int) -> [Int] {
    var numbers = [Int]()

    for _ in 0..<size {
        let newNumber = generator()
        numbers.append(newNumber)
    }

    return numbers
}

인수로 함수 => 클로저를 받는 예제

숫자 생성용 함수를 받아서 사이즈만큼 루핑을 돌면서 생성하고 배열을 리턴!

 

let rolls = makeArray(size: 50) {
    Int.random(in: 1...20)
}

print(rolls)

위의 함수를 이용해서 20까지 랜덤수를 50개 만드는 실행구문 입니다. 

여기서 재밌는 Int.random  swift 내장함수로 각 타입별 random 이 있습니다. Double.random 도 있음

 

func doImportantWork(first: () -> Void, second: () -> Void, third: () -> Void) {
    print("About to start first work")
    first()
    print("About to start second work")
    second()
    print("About to start third work")
    third()
    print("Done!")
}

doImportantWork {
    print("This is the first work")
} second: {
    print("This is the second work")
} third: {
    print("This is the third work")
}

doImportantWork 는 그냥 보면 이상하지만, 위의 함수를 넘겨받는 함수라는걸 알고 보면 이해가 됩니다.

이상하게? 생겼지만 자꾸봐서 눈으로 익숙해 져야 겠네요. 오호..

 

"""
과제:: luckyNumbers를 짝수제외하고 오름차순 정렬후, 정해진 포맷으로 한줄씩 출력하라!
"""
let luckyNumbers = [7, 4, 38, 21, 16, 15, 12, 33, 31, 49]

let notEvenNumbers = luckyNumbers.filter {!$0.isMultiple(of: 2)}
let ascNumbers = notEvenNumbers.sorted { $0<$1 }
let format = ascNumbers.map { "\($0) is a lucky number" }

for text in format {
    print(text)
}

 

반응형