정확한 사용이 아닐 수 있지만 터미널 혹은 vscode를 통해서 코드를 확인하는 작업이 필요로 하게 되어서 정리를 하였습니다.
- 작성한 코드의 동작 테스트
- 원하는 대로 이루어지는 지 비교 테스트
C언어, C++을 사용하다보니 컴파일이 조금 더 익숙하기에 이와 같은 방법을 찾게 되었습니다.
Compile은 소스코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 것입니다.
swift에서 build하는 과정 (참고, 참고)
swiftc 를 통한 compile
// double.swift
extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
}
// main.swift
let holly: Double = 10.km
print(holly)
let marathonDistance = 42.km + 195.m
print("마라톤의 총 거리는 \(marathonDistance)m 입니다")
// In terminal
swiftc main.swift double.swift -o Test
-o 옵션을 사용하여 실행파일의 이름을 지정할 수 있습니다.
여러 파일의 경우 main 함수의 동작을 하는 파일은 하나여야만 합니다.
만약 double 파일에서 marathon = 42.km + 195.m 를 입력 후, 출력을 하게끔 한다면 컴파일 실행 시 오류를 맞이할 수 있습니다.
swift help 를 치게 되면 swift 명령어 및 옵션에 대한 내용을 확인할 수 있습니다
swift package
swift 라이브러리를 만들어 쉽게 테스트, 실행 및 작성을 할 수 있습니다. Swift Package Manager는 많은 상호 의존하는 라이브러리를 사용할때 발생할수 있는 의존성 문제를 해결합니다.
iterm 혹은 vscode 의 터미널 내에서 원하는 폴더에 swift package 를 설치를 하기 위해서는
swift package init
// 실행 가능한 SPM을 만들기 위해서는
swift package init --type=executable
위 명령어를 통해 새로운 패키지를 생성합니다.
이것 저것 폴더와 package.swift 가 생성되었는데, package 파일을 열어보면 아래와 같은 코드가 있습니다.
// swift-tools-version: 5.6
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "5. graph",
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages this package depends on.
.executableTarget(
name: "5. graph",
dependencies: []),
.testTarget(
name: "5. graphTests",
dependencies: ["5. graph"]),
]
)
SPM을 쓰는 방법에는 여러가지 있겠지만, 원하는 부분을 만들고 제가 사용하는 방법에 대해서만 이야기를 하도록 하겠습니다.
swift run 이라는 명령어를 통해서 executableTarget 에 적힌 내용대로 Sources/4. greedy 폴더 내 파일들을 실행하겠다라는 의미 됩니다. 그리고 swift test 라는 명령어를 통해서 testTarget 에 적힌 내용대로 실행이 되는데, Tests/4. greedyTests 내 파일이 실행이 되게 됩니다.
우선 제가 첫 사용으로는 알고리즘에 대한 내용에 대해서 어떻게 동작이 되는지를 확인하기 때문에 각각에 대한 답을 비교해서 테스트 하는 것이 아니어서 Test 부분이 아닌 run 으로 실행하고 어떻게 보여지는 건지 말을 하도록 하겠습니다.
제가 SPM을 사용한 것으로는 각각의 함수에 대해서 어떻게 출력이 되는지 확인을 하는 방법인데,
package 내부에 products에 내용을 우선 추가를 하도록 하겠습니다.
let package = Package(
name: "5. graph",
products: [
.executable(name: "floyd", targets: ["floyd"]),
.executable(name: "bfs", targets: ["bfs"]),
.executable(name: "modifiedBfs", targets: ["modifiedBfs"]),
.executable(name: "dijkstra", targets: ["dijkstra"]),
],
dependencies: [],
targets: [
.executableTarget(
name: "dijkstra",
dependencies: []),
.executableTarget(
name: "floyd",
dependencies: []),
...
Sources 에는 각각 확인할 폴더가 존재하고 폴더 안에는 main.swift가 한 개씩 들어가 있습니다.
각 executableTarget 마다 swift run "name" 명령어를 치게 되면 각각의 폴더 내 코드를 확인할 수 있습니다.
우선 코드를 테스트를 하기 위해서 각 폴더 내에서는 함수의 반환갑을 print 문으로 보여지게 했으며, main 문에서는 그 함수를 통해서 값을 확인할 수 있도록 하여서 잘못된 점을 고쳤습니다.
SPM에 대한 것은 일반적으로 Xcode로 하기 때문에, 원하는 동작을 하도록 만드는 게 오래 걸리긴 했지만 이렇게 함으로써 테스트를 하고 더 정확한 코드를 짤 수 있었던 거 같아 좋았습니다.
이것을 Xcode가 아닌 곳에서 동작을 할 때, 어떤 퍼포먼스를 낼 수 있는지는 심화 과정 같이 다음에 추가적으로 글을 작성을 하도록 하겠습니다.
'Language > Swift' 카테고리의 다른 글
[Swift] image asset 1x, 2x, 3x (0) | 2022.09.08 |
---|---|
[Swift] 불투명한 유형을 some으로 반환 그리고 Scene (0) | 2022.09.07 |
swift extensions (0) | 2022.08.24 |
swift optional chain (0) | 2022.08.24 |
swift class type casting, init (0) | 2022.08.24 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!