Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过引用指定Swift结构?_Swift_Struct_Reference_Cgrect - Fatal编程技术网

如何通过引用指定Swift结构?

如何通过引用指定Swift结构?,swift,struct,reference,cgrect,Swift,Struct,Reference,Cgrect,我们知道,在Swift中,类是引用对象,而结构和其他数据类型是值类型。我试图将CGRect的引用转换成一个变量,这样我就可以用一个较短的名称来更改它的值。有没有办法做到这一点?使用Objto-C或C++指针语法在这里是没有用的: let reference = someView.frame frame = ... 如果我停留在视图级别,这没关系,因为它是引用类型,但我希望在引用中包含框架。您可能不想使用引用。。。我可能错了,你可能有一个很好的理由想要一个推荐人。但是看看你正在尝试做什么,这可能

我们知道,在Swift中,类是引用对象,而结构和其他数据类型是值类型。我试图将CGRect的引用转换成一个变量,这样我就可以用一个较短的名称来更改它的值。有没有办法做到这一点?使用Objto-C或C++指针语法在这里是没有用的:

let reference = someView.frame
frame = ...

如果我停留在视图级别,这没关系,因为它是引用类型,但我希望在引用中包含框架。

您可能不想使用引用。。。我可能错了,你可能有一个很好的理由想要一个推荐人。但是看看你正在尝试做什么,这可能是一个更好的方法:

将要使用的框架指定给变量:

var workingFrame=someView.frame

使用副本,进行您想要进行的任何更改:

workingFrame=someNewRect

将someView.frame更新为新值:

someView.frame=工作框架

从技术上讲,有一种方法可以直接处理指向内存地址的指针,但除非你有一个非常好的理由去那里,否则我认为大多数人会建议你避免使用它

[编辑:]

如果您确实想尝试使用指向内存地址的指针,那么您可能需要查看UnsafePointer、unsafeutablepointer、unsafeBitCast:和unsafeAddressOf:。这些类型和函数将为您提供指向结构的指针

例如,可以获得指向Int值的可变指针,如下所示:

let x = 5

let ptr: UnsafeMutablePointer<Int> = UnsafeMutablePointer(unsafeAddressOf(x))
不鼓励以这种方式处理值、指针和内存地址,但确实是可能的

但是,使用unsafeAddressOf会将Int转换为类,因此即使它不是指向原始结构的指针。您可能最终需要初始化一个不可配置的指针,为其分配内存,然后为该内存分配一个值。然后可以在该内存地址对数据执行操作。查看文档中的UnsafeMutablePointer

如果你能给出更多的细节,确切地说,你想做什么,可能会有一个更优雅的解决方案。Swift不便于使用指针,但它通常提供其他工具,允许您以不同的方式完成所需任务。

以下是解决方案:

func pointerTo<T>(inout object: T) -> UnsafeMutablePointer<T> { 
    return withUnsafeMutablePointer(&object) {UnsafeMutablePointer<T>($0)}
}

恐怕我对这个问题的解释过于简化了。我真的很想要一个指向结构的指针。我一直在绞尽脑汁寻找解决方法,即使是通过函数中的inout参数,但似乎没有办法……:'我不敢相信这种语言不会让你有指向任何数据类型的指针。这太疯狂了……我编辑了我的答案,试图为你指出正确的方向。我正在Swift 2.1游乐场上测试你的代码,它抛出EXC_BAD_指令错误UnsafeAddressOf似乎只对类有效。尝试使用Int编写代码时,代码崩溃,但未使用UIView。这似乎是最荒谬的,因为类不需要太多指针,因为它们是引用类型。这难道不被认为是对指针的转义,从而导致未定义的行为,即使它有效吗?这实际上可能比一般的不安全的东西更危险。