[ios] Swift의 전역 상수 파일
내 Objective-C 프로젝트에서 종종 전역 상수 파일을 사용하여에 대한 알림 이름 및 키와 같은 것을 저장합니다 NSUserDefaults
. 다음과 같이 보입니다 :
@interface GlobalConstants : NSObject
extern NSString *someNotification;
@end
@implementation GlobalConstants
NSString *someNotification = @"aaaaNotification";
@end
Swift에서 정확히 똑같은 일을 어떻게합니까?
답변
네임 스페이스로서의 구조
IMO는 이러한 유형의 상수를 처리하는 가장 좋은 방법은 Struct를 만드는 것입니다.
struct Constants {
static let someNotification = "TEST"
}
그런 다음 예를 들어 코드에서 다음과 같이 호출하십시오.
print(Constants.someNotification)
중첩
더 나은 조직을 원한다면 세그먼트 하위 구조를 사용하는 것이 좋습니다.
struct K {
struct NotificationKey {
static let Welcome = "kWelcomeNotif"
}
struct Path {
static let Documents = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
static let Tmp = NSTemporaryDirectory()
}
}
그런 다음 예를 들어 사용할 수 있습니다. K.Path.Tmp
실제 예
이것은 단지 기술적 인 해결책이며 내 코드의 실제 구현은 다음과 같습니다.
struct GraphicColors {
static let grayDark = UIColor(0.2)
static let grayUltraDark = UIColor(0.1)
static let brown = UIColor(rgb: 126, 99, 89)
// etc.
}
과
enum Env: String {
case debug
case testFlight
case appStore
}
struct App {
struct Folders {
static let documents: NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
static let temporary: NSString = NSTemporaryDirectory() as NSString
}
static let version: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
static let build: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
// This is private because the use of 'appConfiguration' is preferred.
private static let isTestFlight = Bundle.main.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"
// This can be used to add debug statements.
static var isDebug: Bool {
#if DEBUG
return true
#else
return false
#endif
}
static var env: Env {
if isDebug {
return .debug
} else if isTestFlight {
return .testFlight
} else {
return .appStore
}
}
}
답변
나는 파티에 늦었다.
여기에 상관없이 상수 파일을 관리하는 방법은 신속하게 코드를 작성하는 동안 개발자에게 더 합리적입니다.
URL :
//URLConstants.swift
struct APPURL {
private struct Domains {
static let Dev = "http://test-dev.cloudapp.net"
static let UAT = "http://test-UAT.com"
static let Local = "192.145.1.1"
static let QA = "testAddress.qa.com"
}
private struct Routes {
static let Api = "/api/mobile"
}
private static let Domain = Domains.Dev
private static let Route = Routes.Api
private static let BaseURL = Domain + Route
static var FacebookLogin: String {
return BaseURL + "/auth/facebook"
}
}
고객의 경우 :
//FontsConstants.swift
struct FontNames {
static let LatoName = "Lato"
struct Lato {
static let LatoBold = "Lato-Bold"
static let LatoMedium = "Lato-Medium"
static let LatoRegular = "Lato-Regular"
static let LatoExtraBold = "Lato-ExtraBold"
}
}
APP에 사용 된 모든 키
//KeyConstants.swift
struct Key {
static let DeviceType = "iOS"
struct Beacon{
static let ONEXUUID = "xxxx-xxxx-xxxx-xxxx"
}
struct UserDefaults {
static let k_App_Running_FirstTime = "userRunningAppFirstTime"
}
struct Headers {
static let Authorization = "Authorization"
static let ContentType = "Content-Type"
}
struct Google{
static let placesKey = "some key here"//for photos
static let serverKey = "some key here"
}
struct ErrorMessage{
static let listNotFound = "ERROR_LIST_NOT_FOUND"
static let validationError = "ERROR_VALIDATION"
}
}
컬러 상수의 경우 :
//ColorConstants.swift
struct AppColor {
private struct Alphas {
static let Opaque = CGFloat(1)
static let SemiOpaque = CGFloat(0.8)
static let SemiTransparent = CGFloat(0.5)
static let Transparent = CGFloat(0.3)
}
static let appPrimaryColor = UIColor.white.withAlphaComponent(Alphas.SemiOpaque)
static let appSecondaryColor = UIColor.blue.withAlphaComponent(Alphas.Opaque)
struct TextColors {
static let Error = AppColor.appSecondaryColor
static let Success = UIColor(red: 0.1303, green: 0.9915, blue: 0.0233, alpha: Alphas.Opaque)
}
struct TabBarColors{
static let Selected = UIColor.white
static let NotSelected = UIColor.black
}
struct OverlayColor {
static let SemiTransparentBlack = UIColor.black.withAlphaComponent(Alphas.Transparent)
static let SemiOpaque = UIColor.black.withAlphaComponent(Alphas.SemiOpaque)
static let demoOverlay = UIColor.black.withAlphaComponent(0.6)
}
}
이 모든 파일을 Xcode 프로젝트에서 Constants 라는 공통 그룹으로 래핑 할 수 있습니다 .
이 비디오 를 더 보려면
답변
@Francescu의 방식을 선호하지만 (정적 속성이있는 구조체 사용) 전역 상수와 변수를 정의 할 수도 있습니다.
let someNotification = "TEST"
그러나 지역 변수 / 상수 및 클래스 / 구조체 속성과 달리 전역 변수는 암시 적으로 게 으르므로 처음 액세스 할 때 초기화됩니다.
제안 읽기 : 전역 및 지역 변수 및 Swift의 전역 변수는 변수가 아닙니다.
답변
Constant.swift
import Foundation
let kBaseURL = NSURL(string: "http://www.example.com/")
ViewController.swift
var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)
답변
열거를 고려하십시오. 별도의 사용 사례를 위해 논리적으로 나눌 수 있습니다.
enum UserDefaultsKeys: String {
case SomeNotification = "aaaaNotification"
case DeviceToken = "deviceToken"
}
enum PhotoMetaKeys: String {
case Orientation = "orientation_hv"
case Size = "size"
case DateTaken = "date_taken"
}
다음과 같이 상호 배타적 인 옵션이있는 상황에서 고유 한 이점이 있습니다.
for (key, value) in photoConfigurationFile {
guard let key = PhotoMetaKeys(rawvalue: key) else {
continue // invalid key, ignore it
}
switch (key) {
case.Orientation: {
photo.orientation = value
}
case.Size: {
photo.size = value
}
}
}
이 예에서는의 경우를 처리하지 않았기 때문에 컴파일 오류가 발생합니다 PhotoMetaKeys.DateTaken
.
답변
또는 GlobalConstants.swift에서 :
import Foundation
let someNotification = "aaaaNotification"
답변
다른 사람들이 언급했듯이 클래스 외부에서 선언 된 것은 글로벌입니다.
싱글 톤을 만들 수도 있습니다.
class TestClass {
static let sharedInstance = TestClass()
// Anything else goes here
var number = 0
}
이 클래스에서 무언가를 사용하려고 할 때마다 다음과 같이 작성하십시오.
TestClass.sharedInstance.number = 1
println(TestClass.sharedInstance.number)
프로젝트의 어느 곳에서나 쓰면 1
로그에 인쇄 됩니다. 이것은 모든 종류의 객체에 적용됩니다.
tl; dr : 클래스의 모든 것을 전역으로 만들고 클래스에 추가 static let sharedInstance = YourClassName()
하고 접두어로 클래스의 모든 값을 처리 하려고 할 때마다YourClassName.sharedInstance