相关疑难解决方法(0)

在Swift中使用C字符串,或者:如何将UnsafePointer <CChar>转换为CString

在Swift中使用标准C库函数时,我在传递C字符串时遇到了问题.作为一个简单的例子(仅用于演示问题),标准C库函数

char * strdup(const char *s1);
Run Code Online (Sandbox Code Playgroud)

接触Swift作为

func strdup(_: CString) -> UnsafePointer<CChar>
Run Code Online (Sandbox Code Playgroud)

这意味着返回值strdup()不能传递给另一个strdup()调用:

let s1 : CString = "abc"
let s2 = strdup(s1) // OK, s2 is a UnsafePointer<CChar>
let s3 = strdup(s2) // error: could not find an overload for '__conversion' that accepts the supplied arguments
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何CString从a 创建一个Swift UnsafePointer<CChar>,以便一个标准库函数返回的C字符串可以传递给另一个函数?

我能找到的唯一方法是(使用Swift语言中如何将字符串转换为CString的代码):

let s2a = String.fromCString(s2).bridgeToObjectiveC().UTF8String
let s3 = strdup(s2a)
Run Code Online (Sandbox Code Playgroud)

但我认为这并不令人满意,原因有两个:

  • 对于简单的任务来说太复杂了.
  • (主要原因:)上述转换仅在C字符串是有效的UTF-8字符串时有效,否则失败并出现运行时异常.但是C字符串是一个任意 字符序列,由NUL字符分隔.

备注/背景:当然,使用Swift String …

cstring swift

26
推荐指数
2
解决办法
2万
查看次数

如何使用char**参数将Swift字符串数组传递给C函数

我正在尝试与Swift的旧C终端应用程序进行交互.我已成功集成源代码并将标头从C桥接到Swift.该代码从Xcode 6.3 beta编译并运行.我已将终端应用程序的主要入口点重命名为:

int initialize(int argc, char **argv);
Run Code Online (Sandbox Code Playgroud)

然而,我正在努力将Swift中的参数传递给这个C函数.我的挑战是以正确的格式转换参数.Swift的典型输入看起来像:

let args = ["-c", "1.2.3.4", "-p", "8000"]
Run Code Online (Sandbox Code Playgroud)

我已经尝试搞乱"cStringUsingEncoding(NSUTF8StringEncoding)"和"withUnsafePointer",但到目前为止还没有运气.任何帮助是极大的赞赏!

c language-interoperability swift

9
推荐指数
1
解决办法
1732
查看次数

来自Swift中String的UnsafeMutablePointer <Int8>

我正在使用dgeevAccelerate框架中LAPACK实现的算法来计算矩阵的特征向量和特征值.遗憾的是,Apple文档中没有描述LAPACK功能,仅包含http://netlib.org/lapack/faq.html的链接.

如果你查一下,你会发现前两个参数dgeev是表示是否计算特征向量的字符.在Swift,它是要求的UnsafeMutablePointer<Int8>.当我只是使用时"N",我收到一个错误.的dgeev功能和错误在下面的截图中描述在此输入图像描述

我该怎么做才能解决这个问题?

pointers char lapack accelerate-framework swift

5
推荐指数
1
解决办法
7529
查看次数

Swift中免费的C-malloc()内存?

我正在使用Swift编译器的Bridging Header功能来调用使用分配内存的C函数malloc().然后它返回一个指向该内存的指针.函数原型是这样的:

char *the_function(const char *);
Run Code Online (Sandbox Code Playgroud)

在Swift中,我使用它像这样:

var ret = the_function(("something" as NSString).UTF8String)

let val = String.fromCString(ret)!
Run Code Online (Sandbox Code Playgroud)

请原谅我对Swift的无知,但通常在C中,如果the_function()是malloc的内存并返回它,那么其他人需要在某个时候释放()它.

这是由Swift以某种方式处理还是我在这个例子中泄漏内存?

提前致谢.

c pointers memory-management swift

5
推荐指数
1
解决办法
1798
查看次数

我如何在 Swift 中使用 `syslog`

看起来syslog()函数在 Swift 2 中不可用。

如何syslog在 OS X 上发送消息?

macos syslog swift

5
推荐指数
1
解决办法
1606
查看次数

使用Swift的C API

我正在尝试跟踪网络状态.我查看了FXReachability的代码.具体如下方法.

- (void)setHost:(NSString *)host
{
    if (host != _host)
    {
        if (_reachability)
        {
            SCNetworkReachabilityUnscheduleFromRunLoop(_reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
            CFRelease(_reachability);
        }
        _host = [host copy];
        _status = FXReachabilityStatusUnknown;
        _reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [_host UTF8String]);
        SCNetworkReachabilityContext context = { 0, ( __bridge void *)self, NULL, NULL, NULL };
        SCNetworkReachabilitySetCallback(_reachability, ONEReachabilityCallback, &context);
        SCNetworkReachabilityScheduleWithRunLoop(_reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
    }
}
Run Code Online (Sandbox Code Playgroud)

它的作用是不断检查与指定主机的连接.我正在尝试将此方法转换为Swift,我遇到了一些问题.

1.将主机字符串转换为UTF8.

我必须将主机字符串转换为UTF8并将其传递给SCNetworkReachabilityCreateWithName方法.我无法UTF8String在Objective-C中找到Swift的确切属性.但是,有一个叫做属性utf8String类型.根据文件,

您可以通过迭代其utf8属性来访问String的UTF-8表示.此属性的类型为String.UTF8View,它是无符号8位(UInt8)值的集合,一个用于字符串的UTF-8表示形式中的每个字节:

如何获得字符串的完整UTF8表示而不是无符号8位(UInt8)值的集合?


2. SCNetworkReachabilitySetCallback的回调函数.

此函数的第二个参数需要某种类型SCNetworkReachabilityCallBack.我潜入了源文件,发现它实际上是一个typealias.

typealias SCNetworkReachabilityCallBack = CFunctionPointer<((SCNetworkReachability!, …
Run Code Online (Sandbox Code Playgroud)

c callback utf-8 ios swift

4
推荐指数
1
解决办法
3810
查看次数

将String转换为int8数组

我有一个C结构(旧库,blah blah blah),它包含一个C字符串,现在我需要将CFString和Swift字符串转换为这个c字符串.就像是

struct Product{
   char name[50];
   char code[20];
}
Run Code Online (Sandbox Code Playgroud)

所以我试着把它指定为

productName.getCString(&myVarOfStructProduct.name, maxLength: 50, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

但是编译器给出了以下错误:无法将类型(int8,int8,int8 ....)转换为[CChar].

string swift

4
推荐指数
1
解决办法
1533
查看次数

将Swift字符串转换为CChar指针

在我的swift app项目中,我必须与C API进行交互.其中一个C函数将char指针作为输入,因此我必须将我的swift字符串转换为char指针.但我不知道如何正确地做到这一点.

这是我的示例代码:

var user_id_ptr : UnsafeMutablePointer<CChar> = UnsafeMutablePointer.alloc(100)
var cusID = "123"  
user_id_ptr.memory = cusID.cStringUsingEncoding(NSUTF8StringEncoding)!
Run Code Online (Sandbox Code Playgroud)

我总是遇到这个错误: Cannot assign a value of type '[CChar]' to a value of type 'CChar'

我还检查了答案:Swift中的String中的UnsafeMutablePointer <Int8>

以上答案与我的略有不同.上面的例子只适用于一个字符,但我有一个字符串.另外,我必须向函数传递多个参数,我不能使用像let result ="N".withCString {dgeev_(UnsafeMutablePointer($ 0),UnsafeMutablePointer($ 0),&N,...)}之类的东西.请给我一些如何完成此操作的示例.

c pointers swift

4
推荐指数
1
解决办法
3281
查看次数

在 Swift 中使用 SecKeychainCreate

我正在编写一个应该维护自定义钥匙串的 OS X 应用程序,我正在尝试使用安全框架的 API 来创建钥匙串,但是,我似乎无法让它在 Swift 下编译。

这是我所拥有的,假设它path包含一个可能存在的钥匙串的路径:

let pathName = (path as NSString).UTF8String
var keychain: Unmanaged<SecKeychain>?

var status = withUnsafeMutablePointer(&keychain) { pointer in
    SecKeychainOpen(pathName, pointer)
}

if status != errSecSuccess {
    status = withUnsafeMutablePointer(&keychain) { pointer in
        SecKeychainCreate(pathName, UInt32(0), nil, false, nil, pointer)
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨 SecKeychainCreate 调用中的类型,但是,我不明白我做错了什么。

Cannot invoke 'withUnsafeMutablePointer' with an argument list of type '(inout Unmanaged<SecKeychain>?, (_) -> _)'
Run Code Online (Sandbox Code Playgroud)

如果我稍微修改第二个闭包,我会收到这个编译器错误:

Cannot invoke 'SecKeychainCreate' with an argument list of type '(UnsafePointer<Int8>, UInt32, nil, Bool, …
Run Code Online (Sandbox Code Playgroud)

security macos keychain swift

1
推荐指数
1
解决办法
1321
查看次数

在 Swift 中获取包标识符

我正在尝试使用应用程序的目录获取bundleID,但收到错误:EXC_BAD_ACCESS(code=1, address=0xd8)

应用程序.目录!是一个字符串

let startCString = (application.directory! as NSString).UTF8String //Type: UnsafePointer<Int8>
let convertedCString = UnsafePointer<UInt8>(startCString) //CFURLCreateFromFileRepresentation needs <UInt8> pointer
let length = application.directory!.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
let dir = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, convertedCString, length, false)
let bundle = CFBundleCreate(kCFAllocatorDefault, dir)
let result = CFBundleGetIdentifier(bundle)
Run Code Online (Sandbox Code Playgroud)

我在结果行上收到此错误。

我在这里做错了什么?

cocoa foundation swift

1
推荐指数
1
解决办法
7671
查看次数