Di Objective-C
dalamnya terkadang berguna untuk menggunakan konstanta string statis untuk menentukan kunci API alternatif (misalnya untuk membedakan antara kunci RELEASE dan DEBUG untuk paket analitik, seperti MixPanel, Flurry, atau Crashlytics):
#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif
lalu...
[Analytics startSession:API_KEY];
Bagaimana ini diterjemahkan ke Swift, karena kompiler Swift tidak lagi menggunakan preprocessor?
sumber
=1
... Saya kehilangan sedikit waktu untuk mencoba mencari tahu mengapa itu tidak berfungsi ketika saya melakukannya. Jadi, saya pikir saya akan membagikan berita gembira ini untuk membantu orang berikutnya. :] Bagaimanapun, terima kasih atas jawaban Anda di sini!DEBUG
diActive Compilation Conditions
danDEBUG=1
diPreprocessor Macros
dan konfigurasi ini tidak bekerja sama sekali. Haruskah saya menghapusDEBUG=1
?? Tidak jelas dari komentar di atas.Build Configuration
terlebih dahulu. Periksa jawaban stackoverflow.com/questions/9063100/… ini untuk info lebih lanjut.DIPERBARUI: Xcode 8 sekarang mendukung ini secara otomatis, lihat tanggapan @ DanLoewenherz di atas.
Sebelum Xcode 8, Anda masih dapat menggunakan Macro dengan cara yang sama:
#if DEBUG let apiKey = "KEY_A" #else let apiKey = "KEY_B" #endif
Namun agar mereka dapat diambil oleh Swift, Anda perlu menyetel "Bendera Swift Lainnya" di Pengaturan Build target Anda:
-D
benderasumber
-D
awalanSebagai observasi lanjutan, usahakan untuk tidak menyimpan kunci / rahasia api dalam teks biasa di repositori. Gunakan sistem manajemen rahasia untuk memuat kunci / rahasia ke dalam variabel lingkungan pengguna. Jika tidak, langkah 1 diperlukan, jika dapat diterima.
../set_keys.sh
yang berisi daftarexport API_KEY_A='<plaintext_key_aef94c5l6>'
(gunakan kutipan tunggal untuk mencegah evaluasi)source ../set_keys.sh
dan pindahkan ke bagian atas urutan eksekusiAPI_KEY_A="$API_KEY_A"
Itu menangkap variabel lingkungan ke dalam compiler define yang kemudian digunakan di setiap pemanggilan clang untuk setiap file sumber.
Contoh struktur direktori
[10:33:15] ~/code/memo yes? tree -L 2 . . ├── Memo │ ├── Memo │ ├── Memo.xcodeproj │ ├── Memo.xcworkspace │ ├── Podfile │ ├── Podfile.lock │ └── Pods └── keys
sumber
Dalam paket cepat Anda harus melakukan ini di dalam
swiftSettings
argumen ke.target
dalamPackage.swift
file Anda . Gunakandefine
metode (dokumentasi Apple) atau dokumentasi Swifttargets: [ .target(name: String, dependencies: [Target.Dependency], path: String?, exclude: [String]?, sources: [String]?,, cSettings: [CSetting]?, cxxSettings: [CXXSetting]?, swiftSettings: [SwiftSetting]?, linkerSettings: [LinkerSetting]?),
Punyaku terlihat seperti ini dan berhasil!
swiftSettings: [ .define("VAPOR") ]
dalam kode saya, saya dapat mengkompilasi secara kondisional menggunakan ini:
#if VAPOR
sumber