为什么我不能访问自己?

时间:2016-06-07 11:15:24

标签: ios swift uiview

我是swift的新手,我遇到了返回类型的问题。我有一个类/类型方法,它应该返回同一个类的实例。据我所知,返回实例类型不是本机Swift行为。以下是我所做的示例代码:

public class CustomView: UIView {

  class func createCustomView(arguments: Array) -> Self {
    return createCustomViewInternal(arguments)
  }

  private class func createCustomViewInternal<T>(arguments: Array) -> T {

    return CustomView(frame: CGRectZero).createCustomViewInstance(arguments) as! T
  }

  private func createCustomViewInstance(arguments: Array) -> Self {

    //Do customization here.
    ---> return self
  }

我无法在标记点访问自己。此外,如果我尝试以编程方式添加约束,我会收到编译器错误“无法将类型'Self'的值转换为期望的参数类型'AnyObject?'”。我哪里出错了?

在Objective-C中返回instancetype会更简单。有没有更简单的方法来回归自我?

1 个答案:

答案 0 :(得分:1)

所以你想从UIView中继承。

您可以使用具体类而不是Self。当您不想覆盖时,Self仅与子类相关。 使用CustomView代替Self可以让很多事情变得更轻松。

您可以使用一种类方法而不是两种方法。

您可以覆盖init方法,而不是此自定义方法。

但如果您真的需要这样,那么这是一个有效的解决方案:

import UIKit

public class CustomView: UIView {
    public var property: Int = 0

    public required override init(frame: CGRect) {
        super.init(frame: CGRectZero)
    }

    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    public class func createCustomView(param: Int) -> Self {
        return createCustomViewInternal(param)
    }

    private class func createCustomViewInternal(param: Int) -> Self {
        return self.init(frame: CGRectZero).createCustomViewInstance(param)
    }

    private func createCustomViewInstance(param: Int) -> Self {
        self.property = param

        return self
    }
}

旁注:

参数是具体的给定值。在方法中使用抽象值时,它称为参数。