所以当我尝试使用Metatype作为属性类型实例化一个结构时,我想知道我的游乐场崩溃了,但是当我对一个类做同样的事情时却没有。
结构版本:
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
为什么会这样?尝试实例化struct版本的错误消息非常难以理解:
错误:执行被中断,原因:EXC_BAD_ACCESS (代码= EXC_I386_GPFLT)。这个过程一直留在它的位置 被中断,使用“thread return -x”返回之前的状态 表达评价。
真正奇怪的是,如果我将Metatype协议绑定,那么它将再次使用结构:
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
我在这里缺少什么?
答案 0 :(得分:-1)
这是你在找什么?
//: 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.type.self ......我想?)。请注意,在struct中必须创建一个dog对象,在类中,你没有。