我是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)
。我是否还需要在基本初始化函数中初始化变量?
答案 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。