swift3.0无法将类型'[UnsafeMutablePointer ]'的值转换为期望的参数类型'UnsafeMutablePointer ?'
问题描述:
此代码在Swift2.3中运行良好,现在我将它转换为Swift3。所以我得到这个错误。任何人有想法,如何解决这个问题?swift3.0无法将类型'[UnsafeMutablePointer <Int8>]'的值转换为期望的参数类型'UnsafeMutablePointer <Int8>?'
var cmdLnConf: OpaquePointer?
fileprivate var cArgs: [UnsafeMutablePointer<Int8>]
public init?(args: (String,String)...) {
// Create [UnsafeMutablePointer<Int8>].
cArgs = args.flatMap { (name, value) -> [UnsafeMutablePointer<Int8>] in
//strdup move the strings to the heap and return a UnsageMutablePointer<Int8>
return [strdup(name),strdup(value)]
}
cmdLnConf = cmd_ln_parse_r(nil, ps_args(), CInt(cArgs.count), &cArgs, STrue)
if cmdLnConf == nil {
return nil
}
}
答
根据我们的讨论,似乎在你的C函数的参数应该是char *p[]
我做了一个小测试
//
// f.h
// test001
//
#ifndef f_h
#define f_h
#include <stdio.h>
void f(char *p[], int len);
#endif /* f_h */
我一些基本定义的函数功能
//
// f.c
// test001
#include "f.h"
void f(char *p[], int len) {
for(int i = 0; i<len; i++) {
printf("%s\n", p[i]);
};
};
与所需的桥接报头
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#include "f.h"
快捷 '命令行' 应用
//
// main.swift
// test001
//
import Darwin
var s0 = strdup("alfa")
var s1 = strdup("beta")
var s2 = strdup("gama")
var s3 = strdup("delta")
var arr = [s0,s1,s2,s3]
let ac = Int32(arr.count)
arr.withUnsafeMutableBytes { (p) ->() in
let pp = p.baseAddress?.assumingMemoryBound(to: UnsafeMutablePointer<Int8>?.self)
f(pp, ac)
}
它终于打印
alfa
beta
gama
delta
Program ended with exit code: 0
基础上,因此,您必须使用
let count = CInt(cArgs.count)
cArgs.withUnsafeMutableBytes { (p) ->() in
let pp = p.baseAddress?.assumingMemoryBound(to: UnsafeMutablePointer<Int8>?.self)
cmdLnConf = cmd_ln_parse_r(nil, ps_args(), count, pp, STrue)
}
警告!!! 不要在封闭体内调用cArgs.count
,这里定义了指针!
+0
它工作得很好,非常感谢你 –
请不要使用图片代替代码;将代码粘贴到您的问题中。 –
此外,你的问题的标题给你的答案... –
对不起,我是一个快速c.I完全不知道如何解决它的新手。你能帮我吗? –