在静态上下文中引用“自我”

马特奥普克

我在这里了解为什么我实施的解决方案不起作用。基本上,我有一个叫做的类MyClass,在这个类中,我想有一个从plist文件创建的静态字典。像这样:

class MyClass {        
    static var myDic: [String: String] = NSDictionary(contentsOfFile: Bundle(for: self).path(forResource: "filename", ofType: "plist")!) as! [String: String]    
}

如果这样做,编译器将抱怨:

Cannot convert value of type '(MyClass) -> () -> (MyClass)' to expected argument type 'AnyClass' (aka 'AnyObject.Type')

但是,如果我更改myDicvar并创建返回该dic的静态方法,则一切正常:

class MyClass {
    static func myDic() -> [String: String] {
        return NSDictionary(contentsOfFile: Bundle(for: self).path(forResource: "PlayerRolesWithColors", ofType: "plist")!) as! [String: String]
    }
}

这里有两个问题:

  1. 此正弦波在编译器错误中意味着什么? '(MyClass) -> () -> (MyClass)'
  2. 两种情况有什么区别?为什么前者不能工作而后者很好呢?

谢谢。

staticVoidMan

让我们看一个更简单(有效)的示例,使您的核心问题保持不变:

class ClassName {
    static var bundle = Bundle(for: ClassName.self)
    
    static func getBundle() -> Bundle {
        return Bundle(for: self)
    }
}

首先,让我们注意Bundle(for: AnyClass)一个对象类型。


1.关于变量

变量在顶层,访问self作为ClassName其一个实例类型,它是否被声明为let/ var/ lazy/计算,静态或没有。

所以:

static var bundle = Bundle(for: self)

与:

static var bundle = Bundle(for: ClassName())

两者均无效,并产生以下错误:

无法将类型“ ClassName”的值转换为预期的参数类型“ AnyClass”(又名“ AnyObject.Type”)

当然,这是因为我们传递的是实例类型,而不是预期的Object类型。

解:

static var bundle = Bundle(for: ClassName.self)

2.关于静态功能

至于静态功能,则有所不同。

调用静态方法所基于的元类型在方法中可以作为您使用self(它只是作为隐式参数传递)。

参考:https : //stackoverflow.com/a/42260880/2857130

在我的示例中,我们有:

static func getBundle() -> Bundle {
    return Bundle(for: self)
}

调用时ClassName.getBundle()ClassName.Type将隐式传递给函数。
现在在静态函数中,self类型ClassName.Type为Object类型,可以直接在Bundle(for:)或接受Object类型作为其参数的类似函数中应用

因此,静态函数访问selfClassName.Type是一样的ClassName.self,只是没有那么明显它是隐式传递。

您可以selfstatic函数中确认此行为,甚至self可以在以下示例中观察正常函数的行为:

class ClassName {
    static func check() {
        print("static function check")
        print(type(of: self)) //ClassName.Type
        //same as
        print(type(of: ClassName.self)) //ClassName.Type
        
        //test
        print(type(of: self) == type(of: ClassName.self)) //true
    }
    
    func check() {
        print("normal function check")
        print(type(of: self)) //ClassName
        
        //test
        print(type(of: self) == type(of: ClassName.self)) //false
    }
}

ClassName.check()
ClassName().check()

还向我们展示了正常函数的访问self方式ClassName是实例类型,类似于变量。


概要:

  • Bundle(for:) 接受一个对象类型
  • 顶级变量,self作为ClassName实例类型访问
  • 普通函数访问selfClassName实例类型
  • 静态函数self作为ClassName.Type对象类型访问,因为它隐式传递给函数

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

的java - 非静态方法“getLogger”不能从静态上下文中引用

来自分类Java

非静态方法不能从静态上下文中的java 8流引用

来自分类Java

错误:无法从静态上下文中引用非静态方法'findViewById(int)'

来自分类Java

Android:非静态方法无法从静态上下文中引用。困惑?

来自分类Java

“无法从静态上下文中引用非静态方法”背后的原因是什么?

来自分类Java

非静态类不能从静态上下文中引用

来自分类Java

非静态方法不能从静态上下文中引用

来自分类Java

“不能从静态上下文中引用的非静态变量”?

来自分类Java

java:不能从静态上下文中引用非静态变量错误

来自分类Java

我在animate()中遇到错误,这是“错误:无法从静态上下文中引用非静态方法animate()”

来自分类Java

非静态方法<T> findViewById(int)不能从静态上下文中引用

来自分类Java

出现错误:无法从静态上下文中引用非静态方法'getResources()'

来自分类Java

Java-无法从静态上下文中引用

来自分类Dev

java:非静态变量,不能从静态上下文中引用

来自分类Dev

非静态方法readData(GoogleApiClient,DataReadRequest)不能从静态上下文中引用

来自分类Dev

通知`notify()`不能从静态上下文中引用

来自分类Dev

非静态方法count(int)不能从静态上下文中引用

来自分类Dev

非静态变量s不能从静态上下文中引用

来自分类Dev

非静态变量,不能从静态上下文中引用

来自分类Dev

错误:无法在静态上下文中引用非静态方法“ edit”

来自分类Dev

非静态方法不能从静态上下文中引用

来自分类Dev

非静态方法getIntent()不能从静态上下文中引用

来自分类Dev

试图让我的显示方法工作(不能从静态上下文中引用非静态方法)

来自分类Dev

不能从静态上下文中引用非静态方法“inflate(byte[],int,int)”

来自分类Dev

不能从静态上下文中引用非静态方法 matcher(CharSequence)

来自分类Dev

错误:无法从静态上下文中引用非静态方法 setListMovie(ArrayList<Movie>)

来自分类Dev

JAVA - 不能从静态上下文中引用非静态方法 add(E)

来自分类Dev

不能从静态上下文中引用

来自分类Dev

如何从非活动的静态上下文中引用“getSharedPreferences”

Related 相关文章

  1. 1

    的java - 非静态方法“getLogger”不能从静态上下文中引用

  2. 2

    非静态方法不能从静态上下文中的java 8流引用

  3. 3

    错误:无法从静态上下文中引用非静态方法'findViewById(int)'

  4. 4

    Android:非静态方法无法从静态上下文中引用。困惑?

  5. 5

    “无法从静态上下文中引用非静态方法”背后的原因是什么?

  6. 6

    非静态类不能从静态上下文中引用

  7. 7

    非静态方法不能从静态上下文中引用

  8. 8

    “不能从静态上下文中引用的非静态变量”?

  9. 9

    java:不能从静态上下文中引用非静态变量错误

  10. 10

    我在animate()中遇到错误,这是“错误:无法从静态上下文中引用非静态方法animate()”

  11. 11

    非静态方法<T> findViewById(int)不能从静态上下文中引用

  12. 12

    出现错误:无法从静态上下文中引用非静态方法'getResources()'

  13. 13

    Java-无法从静态上下文中引用

  14. 14

    java:非静态变量,不能从静态上下文中引用

  15. 15

    非静态方法readData(GoogleApiClient,DataReadRequest)不能从静态上下文中引用

  16. 16

    通知`notify()`不能从静态上下文中引用

  17. 17

    非静态方法count(int)不能从静态上下文中引用

  18. 18

    非静态变量s不能从静态上下文中引用

  19. 19

    非静态变量,不能从静态上下文中引用

  20. 20

    错误:无法在静态上下文中引用非静态方法“ edit”

  21. 21

    非静态方法不能从静态上下文中引用

  22. 22

    非静态方法getIntent()不能从静态上下文中引用

  23. 23

    试图让我的显示方法工作(不能从静态上下文中引用非静态方法)

  24. 24

    不能从静态上下文中引用非静态方法“inflate(byte[],int,int)”

  25. 25

    不能从静态上下文中引用非静态方法 matcher(CharSequence)

  26. 26

    错误:无法从静态上下文中引用非静态方法 setListMovie(ArrayList<Movie>)

  27. 27

    JAVA - 不能从静态上下文中引用非静态方法 add(E)

  28. 28

    不能从静态上下文中引用

  29. 29

    如何从非活动的静态上下文中引用“getSharedPreferences”

热门标签

归档