Convertir CFString à NSString - Swift
Je suis en train d'écrire un programme qui va scanner de ports série disponibles et de les présenter dans un menu déroulant. Pourquoi je ne peux pas prendre le CFString
directement à partir de la IORegistryEntryCreateCFProperty()
la fonction et ajouter à ce menu via la chaîne d'interpolation dans la ligne suivante? Pour une raison quelconque, mon la déclaration de la variable est rempli avec l'erreur:
"NSString n'est pas un sous-type de CFString".
import Foundation
import Cocoa
import IOKit
import IOKit.serial
@objc class Serial {
init() {
}
@IBOutlet var serialListPullDown : NSPopUpButton!
func refreshSerialList(defaultprompt: String) {
let masterPort: mach_port_t = kIOMasterPortDefault
let classesToMatch: CFDictionary = IOServiceMatching(kIOSerialBSDServiceValue).takeUnretainedValue()
var matchingServices: io_iterator_t = 0
//remove everything from the pull down list
serialListPullDown?.removeAllItems()
//ask for all the serial ports
let kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, &matchingServices)
if kernResult == KERN_SUCCESS {
//success
while (io_object_t() == IOIteratorNext(matchingServices)) {
var serialport = IORegistryEntryCreateCFProperty(io_object_t(), kIOCalloutDeviceKey, kCFAllocatorDefault, 0)
serialListPullDown?.addItemWithTitle("\(serialport)")
}
}
else {
//error
}
}
}
OriginalL'auteur user3185748 | 2014-08-17
Vous devez vous connecter pour publier un commentaire.
Swift.Chaîne et NSString sont sans frais comblé.
NSString et CFString peut être moulé en une de l'autre, mais vous ne pouvez pas directement exprimés à partir d'un Swift Chaîne CFString ou vice versa.
Suivez ces étapes pour effectuer un cast d'un Fondement de Base de la Chaîne rapidement une Chaîne de caractères:
Exemple pour CFTypeRef:
IORegistryEntryCreateCFProperty renvoie une CFTypeRef, de sorte que vous devez déclarer votre var type CFTypeRef pas CFString
CFTypeRef est comme Tout Cœur " de la Fondation
Tout d'abord, merci pour votre patience que j'ai essayer d'envelopper ma tête autour de cela. L'suggéré CFTypeRef cependant ne semble pas résoudre le problème: imgur.com/DxKrGiX
pas de problème, OK suivant permet de regarder ce que vous appelez IORegistryEntryCreateCFProperty avec. Ce type est kIOCalloutDeviceKey? Je pense qu'elle doit être un CFString, jette comme ceci: CFSTR(kIOCalloutDeviceKey)
OriginalL'auteur Woodstock
À moins que de Swift 2.0 (à vérifier à partir d'un terminal avec
swift --version
), vous pouvez convertir unCFString
à un natif SwiftString
avec un simpleas String
.C'est suffisant, étant donné que Swift
String
type peut être utilisé n'importe oùNSString
est prévu.Un exemple avec un
kUTType*
constante (kUTType*
constantes sont définies par CoreServices et sontCFString
s):Un exemple plus détaillé:
À de tester ce type de vous êtes en relation avec:
À obtenir la chaîne de caractères du type, utilisez
.dynamicType
; dans un contexte de chaîne, il signale l' nom du type de mais notez que vous pouvez obtenir le nom d'un privé, à l'intérieur retour en classe:Encore, vous pouvez considérer ceci comme un
CFString
, comme leis
test ci-dessus montre.Utilisation
_stdlib_getDemangledTypeName()
pour obtenir le vrai, le sous-jacent nom de la classe:OriginalL'auteur mklement0