42305


swiftプログラムで

[code]

    func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
    
[/code]

のような関数があります。  
この「!」ですが、暗黙的アンラップ型(Implicitly Unwrapped
Optional)とのことですが、関数の呼び出しでは必ずnilではない値が入ってくるのになぜ必要なのでしょうか？

ご存知の方、ご教示お願いします。


CC BY-SA 3.0
2018-03-10T15:57:03.357
42303
2018-03-11T00:35:08.397
8593
question
swift
swiftのfunc引数の中にある「!」について


_**必ずnilではない値が入ってくるのになぜ必要なのでしょうか？**_

必要ないですね。ですから、 **現在は**
変更されています。(挙げていただいた例は複数のメソッドがミックスされてしまっているようですが、まぁ、言いたいことは伝わります。)

[`captureOutput(_:didOutput:from:)`](https://developer.apple.com/documentation/avfoundation/avcapturevideodataoutputsamplebufferdelegate/1385775-captureoutput)

> ## Declaration
[code]

>     optional func captureOutput(_ output: AVCaptureOutput,
>                       didOutput sampleBuffer: CMSampleBuffer,
>                            from connection: AVCaptureConnection)
>  
[/code]

[`metadataOutput(_:didOutput:from:)`](https://developer.apple.com/documentation/avfoundation/avcapturemetadataoutputobjectsdelegate/1389481-metadataoutput)

> ## Declaration
[code]

>     optional func metadataOutput(_ output: AVCaptureMetadataOutput,
>                        didOutput metadataObjects: [AVMetadataObject],
>                             from connection: AVCaptureConnection)
>  
[/code]

* * *

ではなぜ「昔はImplicitly Unwrapped Optional型を使用していたのか?」という点ですが。

  * 当時のSwiftがiOS/macOS用のAPIを参照する場合には、Objective-Cのヘッダだけを元にしていた
  * 当時のObjective-Cには、参照型が`nil` (`NULL`)になりうるかどうかを示す方法がなかった

そこでAppleのSwiftチームのメンバーはObjective-
CのAPIを移入するにあたり、「NULLになりうるかどうかの査定が済んでいない参照型は全部Implicitly Unwrapped
Optional型にする」と言う方針を採用しました。

この方針には異論もありましたが、「Implicitly Unwrapped
Optional型は限られた状況以外では使用を非推奨にし、NULLになりうるかどうかの査定が済んだら非Optional型にするか、(明示的)Optional型に変更する」ことで、「NULLになりうるかどうかの査定が済んだ」かどうかがわかりやすくなる、と言うメリットがありました。

* * *

と言うわけで、現在でもImplicitly Unwrapped
Optionalが使用されているApple製のAPIがあれば、そのAPIについては「NULLになりうるかどうかの査定」が済んでいないのか、なんらかの理由でImplicitly
Unwrapped Optionalにしないといけないのだと思われます。

(サードパーティがどう対応するかと言うのはまた別問題で、「そもそもSwift対応のためにObjective-
Cのヘッダーを書き換える気がない」と言う場合もあるでしょう。)

* * *

その他にも、SwiftがObjective-
CのAPIを移入する方法はバージョンごとに少しずつ変化しており、引数ラベルやパラメータのデータ型が変わっていたりします。APIの情報については常に最新のものを参照するように心がけた方が良いでしょう。


CC BY-SA 3.0
2018-03-10T22:58:20.403
42305
2018-03-11T00:35:08.397
2020-06-17T08:14:45.997
-1
13972
42303
answer