Ich verwende this approach, um meine String-Konstanten zusammen zu halten. Mit dem gleichen Beispiel von dieser Stelle:Prevent takeRetainedValue oder takeUnpenetedValue bei Verwendung eines Objective-C Struct
MONExtResult.h
struct MONExtResultStruct {
__unsafe_unretained NSString * const AppID;
__unsafe_unretained NSString * const ErrorCode;
__unsafe_unretained NSString * const Progress;
};
extern const struct MONExtResultStruct MONExtResult;
MONExtResult.m
const struct MONExtResultStruct MONExtResult = {
.AppID = @"appid",
.ErrorCode = @"errorcode",
.Progress = @"progress"
};
Das ist wie so in Objective-C verwendet werden kann:
NSString *str = MONExtResult.AppID;
Wenn ich versuche, es in Swift zu verwenden, aber:
let appID: String = MONExtResult.AppID
... ich den Fehler:
Cannot convert value of type 'Unmanaged<NSString>!' to expected argument type 'String'
Das ist, weil ich den Wert aus den unmanaged wrapper greifen muß und dann konvertieren in einen String:
let appID: String = MONExtResult.AppID.takeUnretainedValue() as String
gibt es eine Möglichkeit, das Ziel-C-Code zu annotieren die Notwendigkeit zu verhindern, für den Aufruf takeUnretainedValue
wie möglich mit CF_IMPLICIT_BRIDGING_ENABLED
oder CF_RETURNS_RETAINED
für C-Funktionen?
Aktualisierung: Die Konstanten müssen sowohl von Objective-C als auch von Swift erreichbar sein. Ansonsten würde ich einfach eine Swift Enum mit String
Rohwert verwenden.
Eine der Anforderungen ist, dass es eine Objective-C-Struktur bleiben muss, da ich es sowohl in Objective-C als auch in Swift verwenden muss. Wenn ich das Enum in Swift erstelle, ist es in Objective-C-Code aufgrund des Rohwerts nicht zugänglich. – Senseful
Bitte geben Sie mir ein Beispiel, wie Sie es verwenden möchten Objective-C – Feldur
Was passiert auch, wenn Sie einfach alle unsicheren, nicht vorhandenen Anmerkungen entfernen? – Feldur