2015-07-09 8 views
5

Ich versuche, einige Objective-C-Kakao in Swift zu replizieren. Alles ist gut, bis ich auf die folgenden kommen:Swift entspricht Objective-C FourCharCode-Anführungszeichen (z. B. 'TEXT')

// Set a new type and creator: 
unsigned long type = 'TEXT'; 
unsigned long creator = 'pdos'; 

Wie kann ich Int64s (oder die richtige Swift-Äquivalent) von Apostroph Zeichenliterale wie diese erstellen?

+0

die Mathematik verwenden, Luke : ''T' * 0x100000 + 'E' * 0x1000 + 'X' * 0x100 + 'T''. –

+2

Das ist ein "FourCharCode", ein Spezialfall einer Multi-Byte-Zeichenkonstante. Soweit ich weiß, sind diese Swift nicht bekannt. Konvertierungsfunktionen von/nach Strings finden Sie hier: http://stackoverflow.com/a/25625744/1187415. –

+0

Danke, dass Sie mich in die richtige Richtung weisen, das erlaubt mir, meine eigene Frage zu beantworten! –

Antwort

5

Ich verwende in meinen Cocoa Scripting-Anwendungen, hält es Zeichen> 0x80 richtig

func OSTypeFrom(string : String) -> UInt { 
    var result : UInt = 0 
    if let data = string.dataUsingEncoding(NSMacOSRomanStringEncoding) { 
    let bytes = UnsafePointer<UInt8>(data.bytes) 
    for i in 0..<data.length { 
     result = result << 8 + UInt(bytes[i]) 
    } 
    } 
    return result 
} 

Edit:

Alternativ

func fourCharCodeFrom(string : String) -> FourCharCode 
{ 
    assert(string.characters.count == 4, "String length must be 4") 
    var result : FourCharCode = 0 
    for char in string.utf16 { 
    result = (result << 8) + FourCharCode(char) 
    } 
    return result 
} 
2

Hinweis: Dies sollte funktionieren, funktioniert aber nicht - es muss ein Fehler sein. Ich lasse das hier, um zu dokumentieren, dass es nicht funktioniert, vielleicht in der Zukunft funktioniert, aber für die Zeit, die am besten ist, die akzeptierte Antwort zu verwenden.

Ich fand die folgenden typealiases aus der Swift API:

typealias FourCharCode = UInt32 
typealias OSType = FourCharCode 

Und die folgenden Funktionen:

func NSFileTypeForHFSTypeCode(hfsFileTypeCode: OSType) -> String! 
func NSHFSTypeCodeFromFileType(fileTypeString: String!) -> OSType 

Das bin ich den entsprechenden Code erstellen lassen sollte:

let type : UInt32 = UInt32(NSHFSTypeCodeFromFileType("TEXT")) 
let creator : UInt32 = UInt32(NSHFSTypeCodeFromFileType("pdos")) 

WARNUNG: Aber es funktioniert nicht auf Xcode 7.0 Beta (7A121l)

+0

Ich bekomme immer 0 mit 'NSHFSTypeCodeFromFileType' in Swift – vadian

+1

Das gleiche hier - wird Ihre Antwort stattdessen akzeptieren - lassen Sie dies hier, damit die Leute das wissen Es existiert, aber es funktioniert nicht. –

1

Hier ist eine einfache Funktion

func mbcc(foo: String) -> Int 
{ 
    let chars = foo.utf8 
    var result: Int = 0 
    for aChar in chars 
    { 
     result = result << 8 + Int(aChar) 
    } 
    return result 
} 

let a = mbcc("TEXT") 

print(String(format: "0x%lx", a)) // Prints 0x54455854 

Es ist für Strings arbeiten, die in einer Int passen. Sobald sie länger werden, verlieren sie Ziffern von oben.

Wenn Sie

result = result * 256 + Int(aChar) 

verwenden, sollten Sie zu einem Absturz kommen, wenn die Zeichenfolge statt zu groß wird.

Verwandte Themen