항상 중도 포기중인 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)
}