在为两个目标配置的 class 中定义一段代码,仅在其中一个目标中配置为 运行
Define a section of code in a class that's configured for two targets to run only in one of the targets
我正在做一个自定义键盘项目。在这个项目中,我有两个目标(应用程序和键盘目标)。现在我构建一个 class 负责处理两个目标的网络数据:
class FeedDataManager: URLManagerdelegate, ModelManagerDelegate {
//Class Variables....
func initForKeyboard() {
self.mModelManager = ModelManager(aContext: self.managedObjectContext())
self.mModelManager.delegate = self
self.mModelManager.mDelegateHashString = hashString(self)
self.mFeedsArray = Array<News>()
mModelManager.getFeeds(&self.mFeedsArray)
self.mURLManager = UrlManager()
self.mURLManager.delegate = self
}
func initForApp() {
self.mModelManager = ModelManager(aContext: self.managedObjectContext())
self.mModelManager.delegate = self
self.mModelManager.mDelegateHashString = hashString(self)
let uuid: String? = UserDefaultsManager.sharedInstance.getObjectForKey("UUID") as? String
self.mURLManager = UrlManager()
self.mURLManager.delegate = self
mURLManager.doGetLanguagesRequest()
if uuid == nil {
mURLManager.doRegistrationRequest()
}
}
//MARK: - News Related Methods
func getNews() {
self.mFeedsArray.removeAll(keepCapacity: false)
self.mModelManager.getFeeds(&self.mFeedsArray)
Logger.printLogToConsole(TAG, aMethodName: __FUNCTION__, aMessage: "Feeds Array Count: \(mFeedsArray.count)")
self.mURLManager.doGetSourcesRequest()
}
func handleRequestResults(aActionCode: Int, aData: NSData? = nil) {
if let val = aData {
if aActionCode == KiboConstants.NetworkActionCodes.GET_NEWS_DONE {
let currentTime: Double = NSDate().timeIntervalSince1970
UserDefaultsManager.sharedInstance.setDouble(currentTime, aKey: KiboConstants.CommonStrings.USER_DEF_LAST_UPDATE_TIME_STAMP)
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
var nextUpdate: AnyObject? = json.valueForKey(KiboConstants.CommonStrings.USER_DEF_NEXT_UPDATE)
self.setTimeWithNextUpdateValue(nextUpdate)
self.mModelManager.updateNews(json, aCallerHashString: hashString(self))
} else if aActionCode == KiboConstants.NetworkActionCodes.GET_SOURCES_DONE {
var jsonWrapped: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if self.mModelManager == nil {
self.mModelManager = ModelManager(aContext: self.managedObjectContext())
self.mModelManager.delegate = self
self.mModelManager.mDelegateHashString = hashString(self)
}
if let json: AnyObject = jsonWrapped {
mModelManager.updateSources(json)
}
} else if aActionCode == KiboConstants.NetworkActionCodes.GET_LANGUAGES_DONE {
#if APPLICATION
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if let val: AnyObject = json {
let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
for item in languages as! Array<AnyObject> {
ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
}
}
#endif
}
} else {
self.setTimeWithNextUpdateValue(KiboConstants.UserDefaultsValues.DEFAULT_NEXT_NEWS_UPDATE_VAL)
}
}
.....
}
如果您查看 handleRequestResults 方法,您将看到以下部分:
#if APPLICATION
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if let val: AnyObject = json {
let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
for item in languages as! Array<AnyObject> {
ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
}
}
#endif
并且在应用程序目标中,我在 预处理器宏 部分定义了以下内容:
现在,当我 运行 调试应用程序并使用 "po APPLICATION" 时,我得到了相关的打印,而在键盘扩展中,我得到了以下错误:error: <EXPR>:1:1: error: use of unresolved identifier 'APPLICATION'
意味着配置被正确读取。
problem/question 是: 在应用程序的 运行 中,此代码仍未执行。有人知道为什么吗?我在这里错过了什么?
我的回答不正确 - 感谢 Emil Adz 让我知道。
在您的代码中您使用 #if
,但您应该使用 #ifdef
。
#if
计算 APPLICATION
并且如果它没有在键盘扩展中定义,应该出现错误消息。
#ifdef
检查是否定义了 APPLICATION
。所以你很可能想要 #ifdef APPLICATION
而不是 #if APPLICATION
.
(我已经有一段时间没有使用预处理器宏了,但我希望我没记错...)
Rainer 的回答是正确的。
不过,您也可以尝试这样做。在您的应用程序目标中添加宏:
申请 = 1
并在您的键盘扩展中添加
申请 = 0
有了它,您将能够毫无问题地使用您当前的代码。而且,作为一个额外的好处,您的键盘扩展不会抱怨找不到 APPLICATION 的定义,而只会忽略代码。
两种方法都有效。
实际上,none 这里的答案是正确的。我使用以下配置实现了我想要的:
plist 文件:
并在代码中完成以下操作:
#if APPLICATION
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if let val: AnyObject = json {
let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
for item in languages as! Array<AnyObject> {
ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
}
}
#endif
结果是这部分代码仅针对具有 APPLICATION 标志的目标进行编译。
一个 link 为我解决了所有问题:Build Configuration Management with Swift
我正在做一个自定义键盘项目。在这个项目中,我有两个目标(应用程序和键盘目标)。现在我构建一个 class 负责处理两个目标的网络数据:
class FeedDataManager: URLManagerdelegate, ModelManagerDelegate {
//Class Variables....
func initForKeyboard() {
self.mModelManager = ModelManager(aContext: self.managedObjectContext())
self.mModelManager.delegate = self
self.mModelManager.mDelegateHashString = hashString(self)
self.mFeedsArray = Array<News>()
mModelManager.getFeeds(&self.mFeedsArray)
self.mURLManager = UrlManager()
self.mURLManager.delegate = self
}
func initForApp() {
self.mModelManager = ModelManager(aContext: self.managedObjectContext())
self.mModelManager.delegate = self
self.mModelManager.mDelegateHashString = hashString(self)
let uuid: String? = UserDefaultsManager.sharedInstance.getObjectForKey("UUID") as? String
self.mURLManager = UrlManager()
self.mURLManager.delegate = self
mURLManager.doGetLanguagesRequest()
if uuid == nil {
mURLManager.doRegistrationRequest()
}
}
//MARK: - News Related Methods
func getNews() {
self.mFeedsArray.removeAll(keepCapacity: false)
self.mModelManager.getFeeds(&self.mFeedsArray)
Logger.printLogToConsole(TAG, aMethodName: __FUNCTION__, aMessage: "Feeds Array Count: \(mFeedsArray.count)")
self.mURLManager.doGetSourcesRequest()
}
func handleRequestResults(aActionCode: Int, aData: NSData? = nil) {
if let val = aData {
if aActionCode == KiboConstants.NetworkActionCodes.GET_NEWS_DONE {
let currentTime: Double = NSDate().timeIntervalSince1970
UserDefaultsManager.sharedInstance.setDouble(currentTime, aKey: KiboConstants.CommonStrings.USER_DEF_LAST_UPDATE_TIME_STAMP)
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
var nextUpdate: AnyObject? = json.valueForKey(KiboConstants.CommonStrings.USER_DEF_NEXT_UPDATE)
self.setTimeWithNextUpdateValue(nextUpdate)
self.mModelManager.updateNews(json, aCallerHashString: hashString(self))
} else if aActionCode == KiboConstants.NetworkActionCodes.GET_SOURCES_DONE {
var jsonWrapped: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if self.mModelManager == nil {
self.mModelManager = ModelManager(aContext: self.managedObjectContext())
self.mModelManager.delegate = self
self.mModelManager.mDelegateHashString = hashString(self)
}
if let json: AnyObject = jsonWrapped {
mModelManager.updateSources(json)
}
} else if aActionCode == KiboConstants.NetworkActionCodes.GET_LANGUAGES_DONE {
#if APPLICATION
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if let val: AnyObject = json {
let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
for item in languages as! Array<AnyObject> {
ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
}
}
#endif
}
} else {
self.setTimeWithNextUpdateValue(KiboConstants.UserDefaultsValues.DEFAULT_NEXT_NEWS_UPDATE_VAL)
}
}
.....
}
如果您查看 handleRequestResults 方法,您将看到以下部分:
#if APPLICATION
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if let val: AnyObject = json {
let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
for item in languages as! Array<AnyObject> {
ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
}
}
#endif
并且在应用程序目标中,我在 预处理器宏 部分定义了以下内容:
现在,当我 运行 调试应用程序并使用 "po APPLICATION" 时,我得到了相关的打印,而在键盘扩展中,我得到了以下错误:error: <EXPR>:1:1: error: use of unresolved identifier 'APPLICATION'
意味着配置被正确读取。
problem/question 是: 在应用程序的 运行 中,此代码仍未执行。有人知道为什么吗?我在这里错过了什么?
我的回答不正确 - 感谢 Emil Adz 让我知道。
在您的代码中您使用 #if
,但您应该使用 #ifdef
。
#if
计算 APPLICATION
并且如果它没有在键盘扩展中定义,应该出现错误消息。
#ifdef
检查是否定义了 APPLICATION
。所以你很可能想要 #ifdef APPLICATION
而不是 #if APPLICATION
.
(我已经有一段时间没有使用预处理器宏了,但我希望我没记错...)
Rainer 的回答是正确的。
不过,您也可以尝试这样做。在您的应用程序目标中添加宏:
申请 = 1
并在您的键盘扩展中添加
申请 = 0
有了它,您将能够毫无问题地使用您当前的代码。而且,作为一个额外的好处,您的键盘扩展不会抱怨找不到 APPLICATION 的定义,而只会忽略代码。
两种方法都有效。
实际上,none 这里的答案是正确的。我使用以下配置实现了我想要的:
plist 文件:
并在代码中完成以下操作:
#if APPLICATION
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(aData!, options: .MutableContainers, error: nil)
if let val: AnyObject = json {
let languages: AnyObject = json.objectForKey(KiboConstants.JsonKeys.JSON_KEY_DATA_LANGUAGES_LOWERCASE)!
for item in languages as! Array<AnyObject> {
ApplicationLanguagesManager.sharedInstance.addLanguageToAvailableLanguagesArray(item)
}
}
#endif
结果是这部分代码仅针对具有 APPLICATION 标志的目标进行编译。
一个 link 为我解决了所有问题:Build Configuration Management with Swift