这个NSErrorPointer类型是什么?

4
  1. 在Swift中,&符号&用于inout参数。例如:

    var value = 3

    func inoutfunc(inout onlyPara: Int) {

    onlyPara++

    }

    inoutfunc(&value) // value现在是4

    看起来onlyPara并不像一个指针,也许它是一个指针,在函数内部使用时会立即被取消引用。onlyPara是一个指针吗?

  2. 当我不需要IntPointer类型时,为什么框架方法使用NSErrorPointer类型?因为由于现有的Objective-C代码,它们无法更改这些方法吗?

  3. 但是为什么Swift将&error转换为NSErrorPointer,它是自动装箱的吗?

    var errorPtr: NSErrorPointer = &error

  4. 当我有一个NSErrorPointer时,如何取消引用它?

    var error: NSError = *errorPtr // 不起作用


也许有人可以启发我。只使用Swift很容易。我认为这些问题是关于Swift和Objective-C之间&运算符的知识点。


你读过《Swift编程语言》中的输入输出参数吗? - Kreiri
在Swift中,只需要使用“是”(Yes),就不需要NSErrorPointer了,这很容易,但这并不能说明什么(例如3. :)为什么使用“&”时自动成为NSErrorPointer等等。 - Binarian
3
在《使用Swift与Cocoa和Objective-C》书中的“错误报告”章节中描述了NSErrorPointer及其用法:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html。 - Martin R
3个回答

7

解决方案4:我找到了如何取消引用它的方法:

var error: NSError = errorPtr.memory!

5
我建议您阅读《使用Swift与Cocoa和Objective-C指南》中的指针部分:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-XID_16 指针部分底部有一张表格,其中解释了类指针如何桥接到Swift指针类型。基于此,NSError指针应该是AutoreleasingUnsafePointer<NSError>。在头文件中搜索NSErrorPointer可以找到这个信息。
typealias NSErrorPointer = AutoreleasingUnsafePointer<NSError?>

为什么在NSError后面会有额外的??我猜是因为NSError也可以是nil
希望这能帮到你!

但是,一个带有“&”的NSError如何自动转换为NSErrorPointer? “&”表示地址吗?我在Swift中没有看到过这个。 - Binarian
2
Swift 中没有实际的指针。一切都是对象。& 基本上意味着: 创建一个类型为 AutoreleasingUnsafePointer<Type> 的对象,其中 Type 是由 & 运算符引用的对象的类型。 生成的对象包含类型和指向所引用对象的内存的实际指针。您无法直接访问指针,而是提供了一个好用的对象来处理。 - Jernej Strasner
1
那是一个非常好的解释。所以 inout 关键字创建了这个 AutoreleasingUnsafePointer,但是让它在 func 内部与实际对象 NSError 一起工作,而不是使用给定的参数 (& NSError)。这非常聪明。我越来越喜欢 Swift。 - Binarian
1
很高兴你能明白!还有一点需要注意;“inout”实际上并不会创建任何东西。它只是一个关键词,告诉编译器指定使用“inout”的函数仅接受该参数的“AutoreleasingUnsafePointer”。 - Jernej Strasner

2

Swift 3

var errorPtr: NSErrorPointer = nil
callSomeFunctionThatReceivesParamByReference(.., error: errorPtr)
if let error = errorPtr?.pointee { ... }

在NSErrorPointer后面不加“?”符号可以吗? - Binarian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接