当我筛选AVFoundation的一些课堂讨论时,我偶然发现了以下内容:
class func defaultDeviceWithMediaType(mediaType: String!) -> AVCaptureDevice!
因为选项对我来说是一个新概念,我有点困惑。
讨论说这种方法可以返回具有给定媒体类型的默认设备,如果不存在具有该媒体类型的设备,则返回nil。"但是,如果它有可能返回nil,为什么他们在return语句中打开这个可选项呢?不应该是AVCaptureDevice?
然后,在查看使用上述方法的示例时,我发现以下内容:
public lazy var device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
public func hasFlash() -> Bool {
if let d = self.device {
return d.hasFlash
}
return false
}
根据我的理解,当你有一个可选项时,你会使用if let
语句,但因为类defaultDeviceWithMediaType
返回一个未包装的变量,为什么需要if let
?< / p>
提前非常感谢你。
答案 0 :(得分:1)
隐式展开的可选项基本上是可选的,在您使用它的任何地方都会获得!
。多数民众赞成
e.g:
//this:
var number: Int? = ...
print(number!)
//is the same as this:
var number: Int! = ...
print(number)
隐式展开的可选项只是为了节省您每次使用它时需要展开它,使用if let
或!
,但它具有{{1}的相同选项作为普通的可选项。
Implicitly unwrapped optionals的一个流行用途是使用网点 - 它们可能不是非选项,因为我们不会nil
在VC的init
中,但我们肯定有它们以后,所以打开它们可以节省我们做init
等烦人事情的需要....
答案 1 :(得分:0)
implicitly unwrapped optional仍然是可选的 - 可能是expect(triggerable = double).to receive(:trigger)
.with('new_activity', 'Shared')
allow(WebsocketRails).to receive(:[]).and_return(triggerable)
get :myroute
。如果您只是写nil
,当self.device.hasFlash
为self.device
时,您将获得例外。