gpt4 book ai didi

swift - 关于快速类型转换的困惑

转载 作者:可可西里 更新时间:2023-11-01 00:59:14 24 4
gpt4 key购买 nike

我在 xcode 7.3.1 的 Playground 上玩着 swift。我对 swift 中的类型转换有点困惑。

所以,这是我尝试过的一些代码。

class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}

class Movie: MediaItem {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}

class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}

var movieItem = Movie(name: "GOT", director: "RRMartin")

movieItem.dynamicType //Movie.Type
(movieItem as? MediaItem).dynamicType //Optional<MediaItem>.Type
var someItm = movieItem as! MediaItem //Movie
someItm.dynamicType //Movie.Type

我在评论中展示了 playground 的输出。在这里您可以看到每一行的类型。

现在根据 apple 的文档,条件形式 as? 返回您尝试向下转换为的类型的可选值。 根据文档,我正在尝试向下转换为 MediaItem ,我将 MediaItem 作为可选类型获取。

但是当我使用强制展开(即 as!)时,返回的类型是 Movie。但我希望它是 MediaItem

另外,要注意的另一件事是,类型实际上发生了变化。一些数据实际上被截断了。因为当我尝试访问电影中存在的 director 属性时,我无法访问它。因为我已经沮丧了。

那么,如果类型是向下转型的,为什么返回的类型是Movie?不应该是 MediaType 吗?

所以,我的问题是,当我将一些派生类(Movie)类型转换为基类(MediaType)时,转换后的类型不应该是基类吗(媒体类型)?

最佳答案

dynamicType告诉你对象的底层类型是什么。它不会告诉您 var 的类型是什么当前引用该对象是。

例如:

let a: Any = 3
a.dynamicType // Int.Type

当然,Swift 会跟踪这些底层类型,这让您可以稍后向下转型 MediaItemMovie (如果这是真的)。​​

当你这样做时,你的困惑就来了:

(movieItem as? MediaItem).dynamicType  //Optional<MediaItem>.Type

可选 是它自己的类型。它是一个具有两个值的枚举:.None.Some(T) . .Some value 有一个关联值,它有自己的动态类型。在您的示例中,当您要求 dynamicType ,它返回了 Optional 的基础类型, Optional<MediaItem>.Type .它没有告诉您与 Optional 关联的值的动态类型是什么。

考虑一下:

let x = (movieItem as? MediaItem)
x.dynamicType // Optional<MediaItem>.Type
x!.dynamicType // Movie.Type

关于swift - 关于快速类型转换的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37988417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com