gpt4 book ai didi

c - 在 C 中使用 Swift 中的 Char 数组

转载 作者:可可西里 更新时间:2023-11-01 00:51:04 24 4
gpt4 key购买 nike

目前我有三个文件

主.swift

var dog = Dog()

dog.age = 12
dog.name = "H" // This is the non workable code

CTester.c

#include <stdio.h>

struct Dog {
int age;
char name[10];
} Dog;

和 C 测试桥接 header

#import "CTester.c"

我试图在 Swift 中使用 C 结构,但是,Char 数组在 Swift 中显示为 10 Int8 的数组。如何获取 Swift 字符串并将其分配给 char 数组?

最佳答案

因此,您可以像这样为您的Dog 编写一些扩展:

swift 2

extension Dog {
var Name: String {
mutating get {
return withUnsafePointer(&self.name) {namePtr in
let charPtr = UnsafePointer<CChar>(namePtr)
//Sorry, this code may crash here...
return String(CString: charPtr, encoding: NSUTF8StringEncoding)!
}
}
set {
withUnsafeMutablePointer(&self.name) {namePtr in
let charPtr = UnsafeMutablePointer<CChar>(namePtr)
let size = sizeofValue(self.name)
strncpy(charPtr, newValue, size - 1)
charPtr[size - 1] = 0
}
}
}
}

Swift 3(使用 Xcode 8 beta 4 测试)

extension Dog {
var Name: String {
mutating get {
return withUnsafePointer(&self.name) {namePtr in
let charPtr = UnsafePointer<CChar>(namePtr)
//The result may contain the Unicode replacement character ("\u{FFFD}")
return String(cString: charPtr)
}
}
set {
withUnsafeMutablePointer(&self.name) {namePtr in
let charPtr = UnsafeMutablePointer<CChar>(namePtr)
let size = sizeofValue(self.name)
strncpy(charPtr, newValue, size - 1)
charPtr[size - 1] = 0
}
}
}
}

看到the linked thread在 Martin R 的评论中,可能有一些改进的空间......(特别是使用 strlcpy 减少你的代码大小和更好的安全性。请检查它。)

但无论如何,它的作用是:

dog.Name = "H"
print(dog.Name) //->H

我发现 Name 的 getter 可能会使您的应用程序崩溃...在您仅存储 ASCII 字符的限制下“有效”。

关于c - 在 C 中使用 Swift 中的 Char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38800061/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com