GVKun编程网logo

在Swift中使用C字符串,或者:如何转换UnsafePointer 到CString(swift 字符串转整型)

1

以上就是给各位分享在Swift中使用C字符串,或者:如何转换UnsafePointer到CString,其中也会对swift字符串转整型进行解释,同时本文还将给你拓展ios–Swift:如何从NSSc

以上就是给各位分享在Swift中使用C字符串,或者:如何转换UnsafePointer 到CString,其中也会对swift 字符串转整型进行解释,同时本文还将给你拓展ios – Swift:如何从NSScanner获取AutoreleasingUnsafePointer的值?、ios – UnsafePointer不再适用于swift 3、ios – 如何使用来自Swift的UnsafeMutablePointer>引用?、ios – 如何在Swift 3中使用UnsafeMutablePointer?等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

在Swift中使用C字符串,或者:如何转换UnsafePointer 到CString(swift 字符串转整型)

在Swift中使用C字符串,或者:如何转换UnsafePointer 到CString(swift 字符串转整型)

在Swift中使用标准C库函数时,在传递C字符串时遇到了问题。作为一个简单示例(仅用于演示问题),标准C库函数

char * strdup(const char *s1);

暴露给Swift

func strdup(_: CString) -> UnsafePointer<CChar>

这意味着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

我的问题是:
如何建立一个斯威夫特CStringUnsafePointer<CChar>,使得由一个标准库函数返回的C字符串可以传递到另一个函数?

我能找到的唯一方法是使用“如何在Swift语言中将字符串转换为CString?”中的代码:

let s2a = String.fromCString(s2).bridgeToObjectiveC().UTF8Stringlet s3 = strdup(s2a)

但是我发现这并不令人满意,原因有两个:

  • 对于一个简单的任务来说太复杂了。
  • (主要原因:) 仅当C字符串是有效的UTF-8字符串时,以上转换才有效,否则它将因运行时异常而失败。但是C字符串是 由NUL字符分隔的 任意 字符序列。

备注/背景: 当然,使用诸如Swift String或Objective-C之类的高级数据结构的高级函数NSString是更可取的。但是,标准C库中有BSD函数,它们在Foundation框架中没有完全对应的功能。

我在尝试回答在Swift中访问temp目录时遇到了这个问题。这里,mkdtemp()是一个BSD函数,没有确切的NSFileManager替代项(据我所知)。
mkdtemp()返回一个UnsafePointer<CChar>必须被传递给
NSFileManager函数stringWithFileSystemRepresentation这需要一个CString 说法。


更新: 从Xcode 6 beta 6开始,此问题不再存在,因为已简化了C字符串到Swift的映射。你可以写

let s1 = "abc"      // Stringlet s2 = strdup(s1) // UnsafeMutablePointer<Int8>let s3 = strdup(s2) // UnsafeMutablePointer<Int8>let s4 = String.fromCString(s3) // String

答案1

小编典典

Swift 1.1(或更早的版本)具有更好的C字符串桥接功能:

let haystack = "This is a simple string"let needle = "simple"let result = String.fromCString(strstr(haystack, needle))

CString类型是完全消失。

ios – Swift:如何从NSScanner获取AutoreleasingUnsafePointer的值?

ios – Swift:如何从NSScanner获取AutoreleasingUnsafePointer的值?

我不知道如何使用AutoreleasingUnsafePointer.我有以下代码:

var myString: AutoreleasingUnsafePointer<Nsstring?>

myScanner.scanUptocharactersFromSet(NSCharacterSet.newlineCharacterSet(),intoString: myString)

现在,我该怎么做才能从’myString’中获取字符串?我知道它可以是零,但我不知道如何得到字符串值,以防它不是零. Swift展开技术仅适用于Optional类型.

谢谢!

解决方法

如果scanUptocharactersFromSet的第二个参数被声明为autoreleasing unsafe指针,即AutoreleasingUnsafePointer< Nsstring?>你应该能够在不明确指针的情况下调用你的函数. Swift让你使用& Nsstring上的运算符?变量以生成自动释放的不安全指针,如下所示:

var str : Nsstring? = nil
myScanner.scanUptocharactersFromSet(NSCharacterSet.newlineCharacterSet(),intoString:&str)

这将使str成为“普通”可选Nsstring,您可以使用常规解包运算符解包.

ios – UnsafePointer不再适用于swift 3

ios – UnsafePointer不再适用于swift 3

在我从 swift 2转换为 swift 3之后,会弹出一个错误以显示下面的行

let value = UnsafePointer<UInt32>(array1).pointee

‘init’ is unavailable: use ‘withMemoryRebound(to:capacity:_)’ to temporarily view memory as another layout-compatible type.

在swift2中它就像

let value = UnsafePointer<UInt32>(array1).memory

有人可以解释一下吗?
对不起,我对swift3很新

我做了更改后

let abc = UnsafePointer<UInt32>(array1).withMemoryRebound(to: <#T##T.Type#>,capacity: <#T##Int#>,<#T##body: (UnsafeMutablePointer<T>) throws -> Result##(UnsafeMutablePointer<T>) throws -> Result#>)

但仍然应该对变量有什么价值?对不起,我有搜索但很糟糕,我找不到解决方案

解决方法

你可以试试这个:

let rawPointer = UnsafeRawPointer(array1)
let pointer = rawPointer.assumingMemoryBound(to: UInt32.self)
let value = pointer.pointee

原始指针是用于访问非类型数据的指针.

assumeMemoryBound(to :)可以从UnsafeRawPointer转换为UnsafePointer< T>.

参考:Swift 3.0 Unsafe World

ios – 如何使用来自Swift的UnsafeMutablePointer>引用?

ios – 如何使用来自Swift的UnsafeMutablePointer>引用?

我正在使用SceneKit的SCNParticleSystem构建测试应用程序.它有一个回调,可以让您修改每个框架上的粒子属性.这个回调的签名是
typealias SCNParticleModifierBlock = (UnsafeMutablePointer<UnsafeMutablePointer<Void>>,UnsafeMutablePointer<Int>,Int,Float) -> Void

苹果开发者站点参考 – SCNParticleSystem_Class

我不知道如何访问和修改这个引用从Swift.如果这是C,那么我可以像数组一样去取消引用.

经过一段时间之后,我已经达到这个目标:

..... 
           particleSystem?.addModifierForProperties([SCNParticlePropertySize],atStage: SCNParticleModifierStage.PostDynamics,withBlock: doit2)
}

struct Foos {
    var size:float_t
}
func doit2(data:UnsafeMutablePointer<UnsafeMutablePointer<Void>>,dataStride: UnsafeMutablePointer<Int>,start:Int,end:Int,deltaTime:Float) -> Void {
    let myptr = UnsafeMutablePointer<UnsafeMutablePointer<Foos>>(data)
    print("indexes",start,end)
    for i in 0 ..< end {
        print(i,myptr[i].memory.size)
    }
}¸

这适用于第一个粒子,但在第二个粒子上崩溃.第一次调用函数有0个粒子,所以它跳过循环.第二次有三个粒子,所以尝试打印出来.第一个大小值为0.9,接缝合理.第二个大小的值显然是假的,然后它崩溃了,我进入调试器.

indexes 0 0
indexes 0 3
0 0.929816
1 1.51296e-39
(lldb)

接近我可以告诉任何人在互联网上使用这个功能.我发现的唯一的参考是苹果的文档,只提供ObjC的例子,而不是Swift.

帮我!

解决方法

例如:
var data = [[0.1,0.2],[0.3,0.4],[0.5,0.6]]
let pData = UnsafeMutablePointer<UnsafeMutablePointer<Void>>(data)
// how to reconstruct the original data ??

// we need to kNow how much data we have
let count = data.count
// we need to kNow what type of data we have
let p2 = UnsafeMutablePointer<Array<Double>>(pData)
// access the data
for i in 0..<count {
    print((p2 + i).memory)
}
// [0.1,0.2]
// [0.3,0.4]
// [0.5,0.6]

我认为在你的代码中,myptr的声明是错误的

let myptr = UnsafeMutablePointer<UnsafeMutablePointer<Foos>>(data)

您的示例中的dataStride.count应为1(属性数),其元素的值应为float(属性的大小)大小.

也要小心!你的循环应该是这样的

for i in start..<end {
...
}

你确定开始是0吗?

ios – 如何在Swift 3中使用UnsafeMutablePointer?

ios – 如何在Swift 3中使用UnsafeMutablePointer?

我有以下代码写在 Swift 2.2中:
let keyData = NSMutableData(length: 64)!
SecRandomcopyBytes(kSecRandomDefault,64,UnsafeMutablePointer<UInt8>(keyData.mutableBytes))

XCode 8强调第二行并声称

Cannot invoke initializer for type ‘UnsafeMutablePointer<_>’ with an
argument list of type ‘(UnsafeMutableRawPointer)’

虽然我感谢XCode告诉我,我不太明白如何更改UnsafeMutableRawPointer是可以接受的.

有谁知道如何将此代码转换为Swift 3?

解决方法

我建议您在Swift 3中使用Data而不是NSData.
var keyData = Data(count: 64)
let result = keyData.withUnsafeMutableBytes {mutableBytes in
    SecRandomcopyBytes(kSecRandomDefault,keyData.count,mutableBytes)
}

withUnsafeMutableBytes(_ :)被声明为通用方法,因此,在这种简单的情况下,可以使用它而不指定元素类型.

我们今天的关于在Swift中使用C字符串,或者:如何转换UnsafePointer 到CStringswift 字符串转整型的分享已经告一段落,感谢您的关注,如果您想了解更多关于ios – Swift:如何从NSScanner获取AutoreleasingUnsafePointer的值?、ios – UnsafePointer不再适用于swift 3、ios – 如何使用来自Swift的UnsafeMutablePointer>引用?、ios – 如何在Swift 3中使用UnsafeMutablePointer?的相关信息,请在本站查询。

本文标签: