我在这里了解为什么我实施的解决方案不起作用。基本上,我有一个叫做的类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')
但是,如果我更改myDic
var并创建返回该dic的静态方法,则一切正常:
class MyClass {
static func myDic() -> [String: String] {
return NSDictionary(contentsOfFile: Bundle(for: self).path(forResource: "PlayerRolesWithColors", ofType: "plist")!) as! [String: String]
}
}
这里有两个问题:
'(MyClass) -> () -> (MyClass)'
谢谢。
让我们看一个更简单(有效)的示例,使您的核心问题保持不变:
class ClassName {
static var bundle = Bundle(for: ClassName.self)
static func getBundle() -> Bundle {
return Bundle(for: self)
}
}
首先,让我们注意Bundle(for: AnyClass)
一个对象类型。
变量在顶层,访问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)
至于静态功能,则有所不同。
调用静态方法所基于的元类型在方法中可以作为您使用
self
(它只是作为隐式参数传递)。
在我的示例中,我们有:
static func getBundle() -> Bundle {
return Bundle(for: self)
}
调用时ClassName.getBundle()
,ClassName.Type
将隐式传递给函数。
现在在静态函数中,self
类型ClassName.Type
为Object类型,可以直接在Bundle(for:)
或接受Object类型作为其参数的类似函数中应用。
因此,静态函数访问self
的ClassName.Type
是一样的ClassName.self
,只是没有那么明显它是隐式传递。
您可以self
在static
函数中确认此行为,甚至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
实例类型访问self
为ClassName
实例类型self
作为ClassName.Type
对象类型访问,因为它隐式传递给函数本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句