プロジェクト/ターゲット/スキーム
プロジェクト=全体設定、ターゲット=成果物単位、スキーム=実行/分析の組み合わせ。
# スキーム例
# App(本体) / AppTests(単体) / AppUITests(UI)を切替
# ⌘ + R で実行、⌘ + U でテスト
Appleプラットフォーム開発の統合開発環境(IDE)Xcodeを、概要→基本→基礎→最新→応用→発展の順に学べるポータルです。
Xcodeは、エディタ、ビルド/実行、UI設計、テスト、プロファイルまでを一体化したApple純正IDEです。プロジェクト、ターゲット、スキームの概念を中心にアプリのライフサイクル全体を管理します。
プロジェクト=全体設定、ターゲット=成果物単位、スキーム=実行/分析の組み合わせ。
# スキーム例
# App(本体) / AppTests(単体) / AppUITests(UI)を切替
# ⌘ + R で実行、⌘ + U でテスト
Storyboard / XIBとSwiftUI Previewの二刀流。実案件では混在も可。
// SwiftUI サンプル
import SwiftUI
struct HelloView: View {
var body: some View {
Text("Hello, Xcode!")
.font(.title)
.padding()
}
}
LLDBで変数確認、ウォッチ、条件付きブレークポイント、シンボリックブレークポイントなど。
# LLDB例
(lldb) po view.frame
(lldb) breakpoint set --name viewDidAppear
Swift Language Version、Optimization Level、Other Linker Flagsなどを把握。
# 例:Release最適化
SWIFT_OPTIMIZATION_LEVEL = -O
Debug/Release切替、環境変数注入、Arguments Passed On Launchの管理。
# 例:開発API切替
APP_ENV=dev
FEATURE_FLAG_EXPERIMENTAL=1
import XCTest
@testable import MyApp
final class MathTests: XCTestCase {
func testAdd() {
XCTAssertEqual(1 + 2, 3)
}
}
import XCTest
final class MyAppUITests: XCTestCase {
func testLoginFlow() {
let app = XCUIApplication()
app.launch()
app.textFields["email"].tap()
app.typeText("user@example.com")
app.secureTextFields["password"].tap()
app.typeText("secret")
app.buttons["Login"].tap()
XCTAssertTrue(app.staticTexts["Welcome"].exists)
}
}
Time Profiler、Leaks、Allocations、Energy Logでボトルネック診断。
ここは運用に合わせて更新してください(手動更新 or JSON差し替え対応)。
news.json を置けば自動でカード表示。Free / Pro、社内配布 / ストア配布などでターゲットを分割、ビルド設定を継承。
# xcodebuild例
xcodebuild \
-scheme MyApp \
-configuration Release \
-destination 'platform=iOS Simulator,name=iPhone 15' \
clean build test
.xcconfig を使って環境ごとの設定をテキスト管理。レビューしやすくCIとも相性◎。
// Debug.xcconfig
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG
API_BASE_URL = https://dev.example.com
Featureごとの分離、Domain/UseCase/Interface/Infraで責務分担。
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
var body: some View {
NavigationStack {
List {
NavigationLink("詳細へ") { Text("Detail") }
}
.navigationTitle("Home")
}
}
}
// AppDelegate.swift(抜粋:Storyboard使用時は最小でOK)
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
true
}