Как получить имя цели?

Вставьте перенастройку сборки в ваше приложение / web.config;

   <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" PublicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="1.0.0.0-4.5.11.0" newVersion="4.5.11.0" />
      </dependentAssembly>

Обратите внимание, что номера версий должны соответствовать установленной вами версии.

29
задан Iducool 13 September 2013 в 10:15
поделиться

6 ответов

Вы можете добавить ключ «TargetName» в свой файл Info.plist:

enter image description here

Затем вы можете получить к нему доступ (быстрый код):

var plistFileName = NSBundle.mainBundle().infoDictionary?["TargetName"] as String
56
ответ дан Sergey Demchenko 13 September 2013 в 10:15
поделиться

** Для Swift 4 **

Я не уверен, насколько хорошо иметь файл констант в Swift, но вы можете создать что-то подобное:

enum TargetType:String, CaseIterable{
    case target1 = "My Target 1"
    case target 2 = "My Target 2"
    case unknown
}

var currentTarget:TargetType = {
    return TargetType(rawValue: (Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? "")) ?? .unknown
}()

Так что вы может вызвать его в любое время, как это

if currentTarget != .unknown{
    print(currentTarget.rawValue)
}

Если вы хотите добавить переменную внутри класса Константы, то:

class Constants: NSObject {

    static var currentTarget:TargetType = {
        return TargetType(rawValue: (Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? "")) ?? .unknown
    }()

}
0
ответ дан Reimond Hill 13 September 2013 в 10:15
поделиться

Swift 4, Xcode 9+

Имя пакета:

Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? ""

Отображаемое имя пакета:

Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? ""

Swift 3, Xcode 8+

let targetName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""
16
ответ дан Lawliet 13 September 2013 в 10:15
поделиться
NSLog(@"Target name: %@",[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]);

Надеюсь помочь вам!

Отредактировано: «CFBundleName» благодарит Макса и Даниэля Бо за вашу благодарность

29
ответ дан Vũ Tuấn Anh 13 September 2013 в 10:15
поделиться

В Xcode 7.3.1

if let targetName = NSBundle.mainBundle().infoDictionary?["CFBundleName"] as? String{
    print(targetName)
}
1
ответ дан Abo3atef 13 September 2013 в 10:15
поделиться

Я должен отметить первоначальный ответ vk.edward.li , так как этот ответ лишь расширяет его.

Все макросы настроек сборки можно легко использовать в исходном коде в качестве макросов препроцессора. Проблема в том, что они не установлены заранее; Вы должны сами указать, к каким из них вы получаете доступ.

enter image description here

Я уже добавил три дополнительных макроса препроцессора. Просто нажмите + и добавьте следующее: TARGET_NAME=\""$TARGET_NAME"\", и вы предоставили себе доступ к еще одному макросу настроек сборки.

Project settings ––> Build Settings ––> Apple Clang - Preprocessing[Preprocessor Macros]. Обратите внимание, что если вы попытаетесь вставить их для обоих режимов компиляции, макрос DEBUG=1 будет удален, но его можно будет легко добавить сразу после этого.

Также стоит отметить, что значения макросов должны быть установлены по-разному для разных языков: Objective-C и C++ / Swift и т. Д. Это связано с префиксом NSString, используемым в Objective-C, поэтому для этот язык, он должен быть MACRO=@\""$MACRO"\" вместо MACRO=\""$MACRO"\".

0
ответ дан Andreas 13 September 2013 в 10:15
поделиться