首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将CFString转换为NSString - Swift

将CFString转换为NSString - Swift
EN

Stack Overflow用户
提问于 2014-08-18 01:38:06
回答 3查看 17.3K关注 0票数 21

我正在尝试写一个程序,它将扫描可用的串行端口,并在弹出菜单中显示它们。为什么我不能直接从IORegistryEntryCreateCFProperty()函数中获取CFString,并通过下一行中的字符串插值将其添加到菜单中?由于某种原因,我的变量声明遇到以下错误:

"NSString不是CFString的子类型“。

代码语言:javascript
复制
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
        }

    }
}
EN

回答 3

Stack Overflow用户

发布于 2014-08-18 03:13:26

Swift.String和NSString是免费桥接的。

NSString和CFString可以相互转换,但不能直接从Swift字符串转换为CFString,反之亦然。

按照以下步骤将Core Foundation字符串转换为Swift字符串:

代码语言:javascript
复制
var cfStr:CFString = "Soon, I'll be a Swift String"
var nsTypeString = cfStr as NSString
var swiftString:String = nsTypeString

CFTypeRef示例:

代码语言:javascript
复制
var cfStr:CFTypeRef = "Soon, I'll be a Swift String"
var nsTypeString = cfStr as NSString
var swiftString:String = nsTypeString
票数 16
EN

Stack Overflow用户

发布于 2015-10-24 02:15:30

至少从Swift 2.0 String开始(从装有swift --version的终端验证),您可以使用简单的String as String.将转换为本机Swift

这就足够了,因为任何需要NSString的地方都可以使用Swift的String类型。

一个带有kUTType*常量的示例 (kUTType*常量由CoreServices定义,并且是CFString):

代码语言:javascript
复制
// Get UTF8 plain text from the pasteboard.
import AppKit
let str = NSPasteboard.generalPasteboard().stringForType(kUTTypeUTF8PlainText as String)

A更详细的示例

代码语言:javascript
复制
// Import at least the Foundation framework.
// Since Cocoa includes Foundation, `import Cocoa` works too.
// (Note that `import CoreServices`, even though it defines type `CFString`,
// is NOT enough - the conversion will fail.)
import Foundation

// Create a CFString.
// The fact that initializing from a `String` literal here works implies that
// the *reverse* cast - String -> CFString - also works.
var cfStr:CFString = "Cast me."

// Convert it to String.
var swiftStr = cfStr as String

要测试您正在处理的是哪种类型的:

代码语言:javascript
复制
cfStr is CFString // true
swiftStr is String // true

要使用获取字符串的类型,请使用.dynamicType;在字符串上下文中,这将报告类型名称,但请注意,您可能会得到私有内部类的名称:

代码语言:javascript
复制
"cfStr is a \(cfStr.dynamicType) instance."
// -> "cfStr is a _NSContiguousString instance." !!

不过,正如上面的is测试所示,您可以将其视为CFString

使用_stdlib_getDemangledTypeName()获取真正的底层类名

代码语言:javascript
复制
_stdlib_getDemangledTypeName(cfStr) // -> "ObjectC.CFString"
_stdlib_getDemangledTypeName(kUTTypeUTF8PlainText) // ditto
票数 16
EN

Stack Overflow用户

发布于 2020-09-17 22:48:27

对我来说,我喜欢做一些扩展,然后再使用它们。阅读起来很方便,也很清楚:

扩展:

代码语言:javascript
复制
extension CFString {
    var string: String {
        return self as String
    }
}

用法:

代码语言:javascript
复制
let specificQueryPart: [String: NSObject] = [
            kSecReturnData.string: true as NSObject,
            kSecAttrService.string: key as NSObject,
            kSecMatchLimit.string: kSecMatchLimitOne
        ]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25351842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档