为什么我不能在 swift 中使用元类型作为结构体的属性?



所以我想知道当我尝试实例化一个将元类型作为属性类型的结构时我的游乐场崩溃,但当我对类做同样的事情时却没有。

结构体版本:

struct Dog {
static func saySomething() {
print("Woof")
}
}

我创建了一个具有元类型绑定属性的结构PetOwner并对其进行了编译。

struct PetOwner {
let name: String
let pet: Dog.Type
}

当我尝试使用它时,操场崩溃了。

// Crashes
let dogOwner = PetOwner(
name: "Joe",
pet: Dog.self
)

但是,当我PetOwner类时:

class PetOwner {
let name: String
let pet: Speaking.Type
init(name: String, pet: Dog.Type) {
self.name = name
self.pet = pet
}
}

然后我可以实例化该类并调用静态方法:

let dogOwner = PetOwner(
name: "Joe",
pet: Dog.self
)
dogOwner.pet.saySomething() // Woof

为什么会这样?尝试实例化结构版本的错误消息非常难以理解:

错误:执行中断,原因:EXC_BAD_ACCESS (代码=EXC_I386_GPFLT)。该过程已留在它的位置 被中断,使用"线程返回-x"返回之前的状态 表达式评估。

真正奇怪的部分是,如果我绑定元类型协议,那么它再次与结构一起使用:

protocol Speaking {
static func saySomething()
}
struct Dog: Speaking {
static func saySomething() {
print("Woof")
}
}
struct PetOwner {
let name: String
let pet: Speaking.Type
}
// Works!
let dogOwner = PetOwner(
name: "Joe",
pet: Dog.self
)
dogOwner.pet.saySomething() // Woof

我在这里错过了什么?

这是你要找的吗?

//: Playground - noun: a place where people can play
import UIKit
struct Dog {
static func saySomething() {
print("Woof")
}
}
struct PetOwner {
let name: String
let pet: Dog
}
let dog = Dog()
// Won't crash
let dogOwner = PetOwner(
name: "Joe",
pet: dog
)
dogOwner.pet

看起来您正在尝试访问Dog.Type(您正在调用Dog.self,其中Dog实际上是Dog.type...所以你在做狗.类型.自己...我想?请注意,在结构中必须创建一个 dog 对象,而在类中,您不需要。

最新更新