在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)
但我认为这并不令人满意,原因有两个:
备注/背景:当然,使用Swift String …
我正在尝试与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",但到目前为止还没有运气.任何帮助是极大的赞赏!
我正在使用dgeevAccelerate框架中LAPACK实现的算法来计算矩阵的特征向量和特征值.遗憾的是,Apple文档中没有描述LAPACK功能,仅包含http://netlib.org/lapack/faq.html的链接.
如果你查一下,你会发现前两个参数dgeev是表示是否计算特征向量的字符.在Swift,它是要求的UnsafeMutablePointer<Int8>.当我只是使用时"N",我收到一个错误.的dgeev功能和错误在下面的截图中描述
我该怎么做才能解决这个问题?
我正在使用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以某种方式处理还是我在这个例子中泄漏内存?
提前致谢.
看起来syslog()函数在 Swift 2 中不可用。
如何syslog在 OS X 上发送消息?
我正在尝试跟踪网络状态.我查看了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的确切属性.但是,有一个叫做属性utf8的String类型.根据文件,
您可以通过迭代其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结构(旧库,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].
在我的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,...)}之类的东西.请给我一些如何完成此操作的示例.
我正在编写一个应该维护自定义钥匙串的 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) 我正在尝试使用应用程序的目录获取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)
我在结果行上收到此错误。
我在这里做错了什么?