【问题标题】:Is there a way to convert UnsafeMutablePointer<String> to UnsafeMutablePointer<Int8>?有没有办法将 UnsafeMutablePointer<String> 转换为 UnsafeMutablePointer<Int8>?
【发布时间】:2020-10-05 21:36:18
【问题描述】:

请在继续之前阅读 EDIT

在 Swift 中,我一直在搞乱 UnsafeMutablePointer's 并且我做了很多例子,比如

var char: [String] = ["0","281411","-78","521074","-3","344657","132","347776","-93","25","44"]
let pointer: UnsafeMutablePointer<Int8> = UnsafeMutablePointer(mutating: char)

但是每次我运行它都会给我以下错误

Cannot assign value of type 'UnsafeMutablePointer<String>' to type 'UnsafeMutablePointer<Int8>'

那么这是否意味着 UnsafeMutablePointer 不能转换为 UnsafeMutablePointer 呢?

任何指导我正确方向的建议都会有所帮助。提前谢谢你。

编辑: 大家好,让我澄清一下 var char: [String] 是错误的。 Matt 对字符串如何进入 UnsafeMutablePointer 给出了很好的解释。您可以在 UnsafeMutablePointer 中输入一个字符串,例如“一些参数”。我这样做的方式是错误的,所以请按照马特的解释。

【问题讨论】:

  • 这对我来说似乎是一个 XY 问题。你到底想达到什么目的?你为什么认为你需要UnsafeMutablePointer&lt;Int8&gt;
  • 您好,所以我正在处理的程序要求我将输入(它是一个字符串)转换为 UnsafeMutablePointer。我可以将诸如“0,281411,-78,521074,-3,344657,132,347776,-93,25,44”之类的字符串转换为 UnsafeMutablePointer。但是,我只是想知道我放在上面的数组是否有可能变成 UnsafeMutablePointer
  • 你到底想用那个指针做什么?找到让应用程序崩溃的方法?因为如果你能以某种方式说服编译器允许这样做,那么让应用程序崩溃是你能做到的最好的事情。
  • 相信我,如果这是我的项目,我根本不会使用它。不幸的是,我别无选择。
  • 问题是,"0,281411,-78,521074,-3,344657,132,347776,-93,25,44" 不是你在第一行创建的。那是一个字符串。你制作的是[String],这是一种非常不同的动物。

标签: arrays swift


【解决方案1】:

C 字符串是Unsafe[Mutable]Pointer&lt;Int8&gt;。有多种方法可以从 Swift 字符串派生出 C 字符串,你就是这样。

为了演示,我将从一个采用 UnsafeMutablePointer&lt;Int8&gt; 的 Objective-C 方法开始。界面如下:

#import <Foundation/Foundation.h>

@interface Thing : NSObject

- (void) passMeACString: (nonnull char[]) s;

@end

这里是实现;它只是打印接收到的 C 字符串,所以我们知道我们得到了一个:

#import "Thing.h"

@implementation Thing

- (void) passMeACString: (nonnull char[]) s {
    NSLog(@"%s", s);
}

@end

现在,如果您查看生成的界面,您会看到:

open class Thing : NSObject {
    open func passMeACString(_ s: UnsafeMutablePointer<Int8>)
}

所以,你看到了吗?它需要一个UnsafeMutablePointer&lt;Int8&gt;。现在我将在 Swift 中制作一个:

    let s = "0,281411,-78,521074,-3,344657,132,347776,-93,25,44"
    var arr = s.cString(using: .utf8)!
    let t = Thing()
    t.passMeACString(&arr)

结果:0,281411,-78,521074,-3,344657,132,347776,-93,25,44 打印在日志中。它奏效了。

【讨论】:

  • 嘿,马特!这100%是我想要的。如果我的问题与 [String] 混淆,我很抱歉。我还是很新,还在学习。我将更新我的问题,以便如果有人发现这个问题会更清楚。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2019-12-08
相关资源
最近更新 更多