以上就是给各位分享在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 字符串转整型)
- ios – Swift:如何从NSScanner获取AutoreleasingUnsafePointer的值?
- ios – UnsafePointer不再适用于swift 3
- ios – 如何使用来自Swift的UnsafeMutablePointer>引用?
- ios – 如何在Swift 3中使用UnsafeMutablePointer?
在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
我的问题是:
如何建立一个斯威夫特CString
从UnsafePointer<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的值?
var myString: AutoreleasingUnsafePointer<Nsstring?> myScanner.scanUptocharactersFromSet(NSCharacterSet.newlineCharacterSet(),intoString: myString)
现在,我该怎么做才能从’myString’中获取字符串?我知道它可以是零,但我不知道如何得到字符串值,以防它不是零. Swift展开技术仅适用于Optional类型.
谢谢!
解决方法
var str : Nsstring? = nil myScanner.scanUptocharactersFromSet(NSCharacterSet.newlineCharacterSet(),intoString:&str)
这将使str成为“普通”可选Nsstring,您可以使用常规解包运算符解包.
ios – UnsafePointer不再适用于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>引用?
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?
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?
解决方法
var keyData = Data(count: 64) let result = keyData.withUnsafeMutableBytes {mutableBytes in SecRandomcopyBytes(kSecRandomDefault,keyData.count,mutableBytes) }
withUnsafeMutableBytes(_ :)被声明为通用方法,因此,在这种简单的情况下,可以使用它而不指定元素类型.
我们今天的关于在Swift中使用C字符串,或者:如何转换UnsafePointer 到CString和swift 字符串转整型的分享已经告一段落,感谢您的关注,如果您想了解更多关于ios – Swift:如何从NSScanner获取AutoreleasingUnsafePointer的值?、ios – UnsafePointer不再适用于swift 3、ios – 如何使用来自Swift的UnsafeMutablePointer>引用?、ios – 如何在Swift 3中使用UnsafeMutablePointer?的相关信息,请在本站查询。
本文标签: