繁体   English   中英

swift3.0无法转换类型为&#39;[UnsafeMutablePointer的值 <Int8> ]&#39;转换为预期的参数类型&#39;UnsafeMutablePointer <Int8> &#39;

[英]swift3.0 Cannot convert value of type '[UnsafeMutablePointer<Int8>]' to expected argument type 'UnsafeMutablePointer<Int8>?'

这段代码在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
    }
}

在此处输入图片说明

根据我们的讨论,您的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM