将C char数组(不安全指针)转换为String

时间:2015-10-19 01:37:32

标签: swift unsafe-pointers

我有一个%s由CoreFoundation方法填充。

如果我使用print占位符对其进行NSLog,则输出就好了。

但是如果我尝试使用Swift的memory,它只会写入内存地址。

尝试了几乎所有内容......我也不明白为什么如果我尝试访问基础EXC_BAD_ACCESS属性,我会得到let deviceName = UnsafeMutablePointer<Character>.alloc(64) /* other statements in which deviceName is filled */ NSLog("device %s by %s", deviceName, manufacturerName) // Outputs correctly the string print(String(deviceName[0])) // Get an EXC_BAD_ACCESS error at runtime print(String(deviceName.memory)) // Get an EXC_BAD_ACCESS error at runtime let str = withUnsafePointer(&deviceName) { String.fromCString(UnsafePointer($0)) } print(str) // Outputs an empty string print("\(deviceName) by \(manufacturerName)") // Outputs just memory addresses

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/tvMoney" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Claim Money"
        android:id="@+id/button" />

</LinearLayout>

1 个答案:

答案 0 :(得分:0)

您似乎不愿意展示您的代码,因此我无法提供帮助。但这看起来错了:

let deviceName = UnsafeMutablePointer<Character>.alloc(64)
/* other statements in which deviceName is filled */

这不是如何在Swift中获取C字符串,如果你认为它在是Swift中的C字符串,那你就错了;它需要是一个Int8(C字符)数组,而不是Swift Character(一个struct!),才能成为一个C字符串。

换句话说,C char(你的问题标题)不是Swift Character - 它们彼此之间没有没有。 C char是一个小数字,Swift Character是面向对象语言的对象,C对此一无所知!