为什么我不能在元数据中使用元数据作为swift中的结构属性?

时间:2018-01-31 00:40:52

标签: swift class struct protocols metatype

所以当我尝试使用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

我在这里缺少什么?

1 个答案:

答案 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对象,在类中,你没有。