在Swift的类扩展函数中使用'self'

我希望能够从Nib中提取UIView子类的实例。

我希望能够调用MyCustomView.instantiateFromNib()并具有MyCustomView的实例。我几乎已经准备好通过桥接头文件来移植我拥有的工作中的Objective-

C代码,但是我想我会首先尝试惯用的方法。那是两个小时前。

extension UIView {

class func instantiateFromNib() -> Self? {

let topLevelObjects = NSBundle.mainBundle().loadNibNamed("CustomViews", owner: nil, options: nil)

for topLevelObject in topLevelObjects {

if (topLevelObject is self) {

return topLevelObject

}

}

return nil

}

}

现在if (topLevelObject is self)

{是错误的,因为“’是’之后的预期类型”。在那之后我尝试过的内容显示了很多我对Swift类型系统不了解的内容。

  • if (topLevelObject is Self) {
  • if (topLevelObject is self.dynamicType) {
  • if (topLevelObject is self.self) {
  • 一百万种甚至没有错误的变化。

任何见解均表示赞赏。

回答:

使用“ 如何在NSManagedObjectSwift扩展中创建托管对象子类的实例”中的方法? 您可以定义一个通用的辅助方法,该方法self从调用上下文中推断出类型:

extension UIView {

class func instantiateFromNib() -> Self? {

return instantiateFromNibHelper()

}

private class func instantiateFromNibHelper<T>() -> T? {

let topLevelObjects = NSBundle.mainBundle().loadNibNamed("CustomViews", owner: nil, options: nil)

for topLevelObject in topLevelObjects {

if let object = topLevelObject as? T {

return object

}

}

return nil

}

}

这可以按照我的快速测试中的预期进行编译和运行。如果 MyCustomView是您的UIView子类,那么

if let customView = MyCustomView.instantiateFromNib() {

// `customView` is a `MyCustomView`

// ...

} else {

// Not found in Nib file

}

为您提供的实例MyCustomView,并且类型是自动推断的。


extension UIView {

class func instantiateFromNib() -> Self? {

return instantiateFromNibHelper()

}

private class func instantiateFromNibHelper<T>() -> T? {

if let topLevelObjects = Bundle.main.loadNibNamed("CustomViews", owner: nil, options: nil) {

for topLevelObject in topLevelObjects {

if let object = topLevelObject as? T {

return object

}

}

}

return nil

}

}

以上是 在Swift的类扩展函数中使用&#39;self&#39; 的全部内容, 来源链接: utcz.com/qa/415547.html

回到顶部