처음엔 Xcode에서 프로젝트폴더를 생성해 해당 폴더에 git clone을 받았으나
gist는 단일 폴더만 지원해 동작하지 않았다.
임시방편으로 clone받은 폴더에 .swift파일을 생성해 거기에 소스코드를 작성하니, 이번엔 .swift파일에서 빌드가 되지 않았다.
이에 대한 방법도 알아봤는데 따라하다가 오류가 많이나서
일단 play ground에서 작성하고 체크포인트 달성마다 swift파일로 옮겨 commit하였다.
스위프트에서는 main함수가 숨겨져있다고 한다.
따라서 main과 같이 동작하려면 @main 이나 @UIApplicationMain을
사용하라 하는데 @UIApplicationMain은 앱에서 사용하는거라 하여 @main을 사용했는데 에러가 났다.
에러 메세지를 검색해보았지만 해답을 찾지 못해 키워드를 지우고 첫번째 함수를 호출하는식으로 일단 하였다.
기본 원소 순회법은 알았지만 인덱스로 순회하는 법을 몰라서 검색해 보았다.
let names = ["Cody", "Cathy", "Angela"]
for index in 0..<names.count {
print(names[index])
}
파이썬에선 중복을 제거할 때 배열을 Set으로 감싼 뒤,
다시 list로 감싸는 방식을 자주 썼는데 스위프트에서도 동일한 방식으로 하는 것 같았다.
Array(Set(arr))
파이썬에선 arr.count("찾는원소") 하면 쉽게 구할 수 있었지만
Swift에선 배열에 count()는 없었고 그냥 count만 있었다.(length랑 동일)
그래서 직접 구현해서 사용하는 법을 검색해 보았다.
let arr = ["D", "D", "R", "D"]
arr.filter { $0 == "D" }.count // 3
filter는 고차함수로 arr.filter {조건} 으로 arr의 요소 중 조건에 맞는 요소만 뽑아 반환하여 그 길이를 재는 식으로 요소의 개수를 구하였다.
대충 reverse() 같은게 있을 것 같아 사용해보니 error가 떴다.
에러 메세지를 보니 arr이 let이라서 변경이 안된다고 하였다.
reverse()는 원본을 직접 바꾸고
reversed()를 쓰면 사본을 바꿔서 반환해준다.
스위프트에서의 삼항연산자 문법을 몰라 검색해 보았다.
let myAgeIs: Int = 29
myAgeIs > 30 ? print("당신은 30대입니다.") : print("당신은 20대입니다.")
// Prints: 당신은 20대입니다.
근데 이 코드대로면 myAgeIs가 30이어도 20대라고 출력되는데
작성자분의 나이를 유추할 수 있는 대목이다.
// 배열을 1보다 크거나 같고 13보다 작거나 같은 정수로 초기화하기
// 배열의 크기 랜덤한 값을 생성할 범위
let arr = (1...3).map { _ in Int.random(in: 1...13) } // [4, 3, 13] let dict: [String: Int] = ["A": 1, "B": 2, "C": 3]
let keys = dict.map { (key: String, value: Int) -> String in
return key
}
let values = dict.map { (tuple: (String, Int)) -> Int in
return tuple.1
}
let dict: [String: Int] = ["A": 1, "B": 2, "C": 3]
// 딕셔너리의 값에 매개변수로 전달된 클로저를 적용한 후, 결과를 모아서 새 딕셔너리를 리턴한다
let newDict = dict.mapValues { (value: Int) in
return value * 2
}
// ["A": 2, "B": 4, "C": 6]
let dict: [String: Int?] = ["A": 1, "B": nil, "C": nil]
// 간단하게 딕셔너리의 옵셔널 값을 언래
let newDict = dict.compactMapValues { $0 } // ["A": 1]
let dict: [String: Int?] = ["A": 1, "B": nil, "C": nil]
let newDict = dict.compactMapValues { (value: Int?) -> Int? in
if let value = value {
return Optional(value * 2)
}
return value
}
// ["A": 2]
let names = ["Yapyap", "Gugu", "Steee", "Steee", "Gugu", "Zoe"]
let countDict = names.reduce(into: [:]) { dict, name in
dict[name, default: 0] += 1
}
// ["Yapyap": 1, "Steee": 2, "Zoe": 1, "Gugu": 2]
입력 배열의 타입은 정수형일거라 굳게 믿었지만 이럴수가, 문자열도 끼워줘야 한다.
아주 간단하게 처음 입력을 체크해 문자열 타입이면 정수형으로 바꾸는 방법도 있겠지만 Java의 제네릭처럼 타입에 구애 없이 할수도 있을 것이다.
그러려면 먼저 스위프트에서 제네릭과 같은 역할을 하는것이 있나 보고
점수 환산식에도 약간의 변경이 필요하다.
다행히도 Swift에도 제네릭과 같은 역할을 하는것이 있었다. (이름도 같다)
문법도 매우 유사하다.
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let tempA = a
a = b
b = tempA
}
그러면 점수 환산식만 변경해주면 끝인데 기존에는 배열 타입이 Int였기 때문에 요소를 직접 활용하였지만 이젠 상황이 바뀌었다.
호기롭게 Generic을 사용하여 모든 타입을 커버해보려 하였지만
그에 맞는 점수 환산식을 찾는 것은 매우 어려운 일인 것 같다.
문자열 타입에 대한 처리만 해본다면 파이썬의 format 함수와 같이 자릿수를 고정해주는 것 만으로 간단하게 해결할 수 있을 것 같다.
let number: Int = 7
let str = String(format: "%02d", number)
print(str) // 07
format도 문법이 파이썬과 매우 유사하다.
역시 언어는 돌고 도는 법.
함수는 먼저 하나의 큰 기능 단위로 나누었고,
해당 기능 내에서 2중 for문과 같이 로직이 길어지는 부분은
또 따로 빼서 함수로 구현해 주었다.
merge request 와 같은 뜻이라 한다.
내가 만든 branch를 원격저장소의 main에 병합 시
내 코드가 문제가 없는지 다른 사람들의 코드 리뷰를 받고 싶을 때 사용하여
코드의 품질을 높이고 main branch의 안정성을 높이는 작업
* 오픈소스 방식에서 주로 사용되는 방식
원격 저장소에 쓰기 권한이 없을 때
원격 저장소를 복제(= fork)하여 작업 후,
오리지널 저장소에 쓰기 권한이 있는 사람에게
나의 원격 저장소를 pull 해가라고 request하는 방식
먼저 로컬에 원격 저장소를 clone하여 원격과 로컬의 내용을 일치 시킨다.
이 후 로컬에서 작업하면 원격과 로컬의 내용에서 차이가 발생한다.
차이 발생 내용을 commit하면 수정 내역이 하나의 묶음이 되어 존재한다.
push를 하면 해당 수정 내역이 원격 저장소에 적용된다.

일반적으로 fetch와 merge를 합친 pull 명령어를 많이 사용
실행되고 있는 콘솔 프로그램의 File - Project Setting에서 빌드 경로를 변경할 수 있다. 기본값은 ~/Library/Developer/Xcode/DerivedData 디렉토리이다.
빌드를 통해 만들어진 실행 파일의 경우, 프로젝트 디렉토리의 /Build/Product 경로에서 실행 파일을 찾을 수 있다.
먼저 Command Line Tools 패키지가 설치되어 있어야 하지만
Xcode를 깔면 같이 깔리기 때문에 터미널에
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer/
명령어를 쳐서 사용 가능하게 설정만 해주면 된다.
먼저 프로젝트가 있는 디렉토리로 이동하고 다음 명령어를 입력한다.
xcodebuild -list -project <project_name>.xcodeproj
xcodebuild -scheme <scheme_name> build
xcodebuild -target <your_target_name> -xcconfig <configuration_file>.xcconfig