在子类化UIView时对初始化器的混淆

时间:2016-01-11 10:25:06

标签: ios swift

我是Swift的新手,并尝试将UIView子类化。到目前为止,我有这样的事情:

class Timer: UIView {

    let totalPoints: Int
    let timeLimit: Double
    var elapsedTime: Double?




    override init(frame: CGRect) {
        super.init(frame: frame)
        self.config()
    }

    //Only called in IB
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.config()
    }

    convenience init() {
        self.init(frame: CGRectZero)
    }




}

我需要初始化totalPoints和timeLimit,但我想创建一个新的初始化函数init(frame: CGRect, timeLimit: Double, elapsedTime: Double)。我是否还需要在基本初始化函数中初始化变量?

3 个答案:

答案 0 :(得分:0)

 use strict;
 use warnings;
 use feature 'say';

 use Mojo;

 my $ua = Mojo::UserAgent->new;

 my $array = $ua->get('http://blogs.perl.org/')->res->dom->find('div > p ')->map('text')->join("\n");

 my @arr = split("\n",$array);
 print "\n$arr[0]\n";

你是说这个吗?

答案 1 :(得分:0)

一个习惯用的习语是而不是来覆盖init...,而是将你的属性声明为隐式解包,例如,

let totalPoints: Int!
let timeLimit: Double!
var elapsedTime: Double?

然后在访问它们之前的某个时间点设置它们。实际上,这是一个承诺,您将及时初始化它们。它通常在UIViewController而不是UIView中实现,因为您可以保证在生命周期的早期调用viewDidLoad,允许您在那里设置drawRect,但是将它们设置在{ {1}}可行。

要放大 - 您只需要在init完成之前初始化非选项。由于这些是可选项,您可以保留它们(如nil),并且由于它们是隐式展开的,因此您在以后引用它们时不需要显式解包它们。只需确保在访问它们之前设置它们,因为不会这样做会崩溃。

答案 2 :(得分:0)

调用super初始值设定项只需传递super所需的信息。在您的情况下,您需要传递CGRect。您需要做的是在调用super初始化您自己的实例变量之前。这也需要在initWithCoder:中完成。

class Timer: UIView {

    let totalPoints: Int
    let timeLimit: Double
    var elapsedTime: Double?

    init(frame: CGRect, totalPoints: Int, timeLimit: Double) {
        self.totalPoints = totalPoints
        self.timeLimit = timeLimit
        super.init(frame: frame)
        self.config()
    }

    required init?(coder aDecoder: NSCoder) {
        self.totalPoints = 0
        self.timeLimit = 0
        super.init(coder: aDecoder)
    }

    func config() {
        // ...    
    }
}

有关类初始值设定项的更多详细信息,请参阅Apple文档:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html