2016-03-21 13 views
0

Ich bin sicher, es gibt eine einfache Antwort auf diese Frage, aber ich schlug meinen Kopf hier.Core Foundation/Swift 2: Ergebnis der CFByteOrderGetCurrent()

In meinem Swift 2-Code (Xcode 7.2.1) Ich CFByteOrderGetCurrent() bin mit der Byte-Reihenfolge der lokalen Maschine zu bekommen.

Ich kann nicht herausfinden, wie das Ergebnis der Funktion ausgewertet werden - die ‚if‘ Anweisung in dem

Compilation mit folgenden versagt „Art des Ausdrucks, ohne mehr Kontext mehrdeutig“:

import Foundation 
let byteOrder = CFByteOrderGetCurrent() 
if byteOrder == .CFByteOrderLittleEndian { // compilation fails here 
    /* do something */ 
} 

Vom CF documentation ich war das Ergebnis der Funktion zu erwarten ein enum, zu sein, aber wenn ich es auf einem Spielplatz versuchen scheint es ein ich zu sein ...

Antwort

2

CFByteOrder ist ein typealias von CFIndex.

Es ist ein enum, welche der folgenden Werte besteht:

CFByteOrderUnknown, 
CFByteOrderLittleEndian, 
CFByteOrderBigEndian 

Somit entspricht CFByteOrderLittleEndian zu 1.

Um den Vergleich zu tun, müssen kann man folgendes tun:

if byteOrder == CFByteOrder(1) 
{ 
    print(byteOrder) 
} 

1 hier entspricht CFByteOrderLittleEndian.

+0

OK Dank - aber gibt es eine Möglichkeit, dass ich die symbolischen verwenden kann Konstanten? Das wäre viel besser lesbar! –

+0

Ich arbeitete heraus, wie den Vergleich mit symbolischen Konstanten zu machen - siehe unten :) –

2

ich verschiedenen Trick eines wenig bin mit ...

if 1.littleEndian == 1 { 
    print("little endian") 
} else { 
    print("big endian") 
} 

allgemein

let isLittleEndian = 1.littleEndian == 1 

trifft auf Little-Endian-System, falsch auf Big-Endian-System. Der Vorteil ist, dass es auf allen Plattformen

+0

ich diesen Ansatz mag, wie es generisch ist, und es ist für den Leser klar, was es tut. –

0

OK arbeitet ich endlich geknackt, wie der Vergleich mit symbolischen Konstanten zu machen.

Wenn Sie das Ergebnis von CFByteOrderGetCurrent() in ein UInt32 konvertieren, dann können Sie es auf den rohen Wert der Konstanten in der Aufzählung vergleichen:

import Foundation 

let hostByteOrder = UInt32(CFByteOrderGetCurrent()) 

if hostByteOrder == CFByteOrderLittleEndian.rawValue { 
    print("little") 
} 
+0

Jemand auf einem anderen Forum wies darauf hin, dass ein anderer Weg, dies zu tun, ist ein ** ** CFByteOrder Wert aus dem Rohwert der Aufzählung erstellen - Sie können dann diese direkt vergleichen: 'wenn CFByteOrderGetCurrent() == CFByteOrder (CFByteOrderLittleEndian.rawValue) {...} ' –

+0

Das gleiche Plakat wies auch darauf hin, dass, wie Swift derzeit nur wenig endian-Plattformen unterstützt, ist dies eine weitgehend akademische Frage! Trotzdem war es eine lehrreiche Übung –