swift3.0 无法将类型“[UnsafeMutablePointer<Int8>]”的值转换为预期的参数类型“UnsafeMutablePointer<Int8>?”
Posted
技术标签:
【中文标题】swift3.0 无法将类型“[UnsafeMutablePointer<Int8>]”的值转换为预期的参数类型“UnsafeMutablePointer<Int8>?”【英文标题】:swift3.0 Cannot convert value of type '[UnsafeMutablePointer<Int8>]' to expected argument type 'UnsafeMutablePointer<Int8>?' 【发布时间】:2017-05-25 04:10:20 【问题描述】:这段代码在 Swift2.3 中运行良好,现在我将其转换为 Swift3。所以我收到了这个错误。任何人都有想法,如何解决这个问题?
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
enter image description here
【问题讨论】:
请不要用图片代替代码;将代码粘贴到您的问题中。 另外,你的问题的标题给了你答案...... 对不起,我是 swift to c 的新手。我完全不知道如何解决它。你能帮帮我吗? 错误告诉你,不是[UnsafeMutablePointer<Int8>]
,而是UnsafeMutablePointer<Int8>
,(所以没有括号)......
但这在 swift2.3 中是正确的,如果我删除括号,还会出现许多其他错误--!
【参考方案1】:
根据我们的讨论,您的 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
!
【讨论】:
以上是关于swift3.0 无法将类型“[UnsafeMutablePointer<Int8>]”的值转换为预期的参数类型“UnsafeMutablePointer<Int8>?”的主要内容,如果未能解决你的问题,请参考以下文章
无法转换预期参数类型 GTLServiceCompletionHandler 的值
无法将“NSTaggedPointerString”类型的值转换为数组
无法为类型 Unsafepointer Swift 3.0 转换初始化变量