如果我有一个swift子类:
self self我还需要调用super.init()子类的init()方法吗?
*注意:由于上面1和2中列出的细节,这个问题与SO上提出并回答的问题不同.
你将如何在Swift中实现以下模式?
所述Container类被初始化,其中包含的词典JSON数组.这些词典用于初始化Entry类.但是,Entry当访问entries或searchEntries访问属性时,对象的初始化会延迟发生.
@interface Container
@property (readonly, nonatomic) NSArray *entryDicts;
@property (readonly, nonatomic) NSArray* entries;
@property (readonly, nonatomic) NSDictionary *searchEntries;
@end
@implementation Container
- (instancetype)initWithArray:(NSArray *)array
{
self = [super init];
if (self) {
_entryDicts = array;
}
return self;
}
@synthesize entries = _entries;
- (NSArray *)entries
{
[self loadEntriesIfNeeded];
return _entries;
}
@synthesize entriesByNumber = _entriesByNumber;
- (NSDictionary *)entriesByNumber
{
[self loadEntriesIfNeeded];
return _entriesByNumber;
}
- (void)loadEntriesIfNeeded
{
if …Run Code Online (Sandbox Code Playgroud) 我正在重写UITableViewControllerswift,其中我有两个必需的变量,这些变量通过使用weak引用来初始化,self因为这些变量用于实现UITableViewDataSource协议并需要self引用以使用其tableView属性
class VideosListViewController: UITableViewController {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.datasourceOfflineVideos = ASDataSource(tableViewController: self)
self.datasourceOnlineVideos = ASDataSource(tableViewController: self)
}
// MARK: - Variables
var datasourceOnlineVideos:ASDataSource
var datasourceOfflineVideos:ASDataSource
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是因为它给出了我Property not initialized at super.init call预期的错误,如下所述:Swift类中的错误:属性未在super.init调用时初始化.
Swift的编译器执行四个有用的安全检查,以确保完成两阶段初始化而没有错误
安全检查1指定的初始化程序必须确保在委托最高级初始化程序之前初始化其类引入的所有属性.
摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11
所以我的问题是:
如果swift类中的实例变量需要self引用像ASDataSource类型变量一样初始化,我该怎么做?
由于swift不允许我调用super.init()之前初始化所有实例变量而且也不允许我在调用之前self在初始化程序中使用init()super.init()
目前我正在使用可选变量来解决问题.但出于学习目的,我想知道如何做到这一点.提前致谢 :)
我有一个派生自UIView的类,但我初始化它总是显示错误说"属性'self.title'未在swift中的super.init调用中初始化"
这是我的代码
class A: UIView
{
var title : String
var recordUrl : String
var content : String
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
init(frame : CGRect ,title : String, recordUrl : String , content : String)
{
super.init(frame: frame)
self.title = title
self.recordUrl = recordUrl
self.content = content
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码示例(来自PlayGround):
class Serializable : NSObject{
override init() { }
}
class Device : Serializable{
var uuid:String
override init() {
println("init ")
self.uuid = "XXX"
self.uuid = Device.createUUID()
println(self.uuid)
}
class func createUUID() -> String{
return "XXX2"
}
}
var device = Device()
Run Code Online (Sandbox Code Playgroud)
您可以注意到我将createUUID方法实现为静态.
但为什么我init不能以静态方式调用此方法?:
class Serializable : NSObject{
override init() { }
}
class Device : Serializable{
var uuid:String
override init() {
// tried
// super.init()
println("init ")
self.uuid = "XXX"
self.uuid = self.createUUID() // ERROR …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 Swift 中的参数初始化一个类。我希望能够将数组传递给类。类似的东西let test = MyTestClass(data)。
代码:
init(data: [CGFloat]){
super.init(nibName: "Test", bundle: nil)
self.data = data
}
required init?(coder decoder: NSCoder) {
super.init(nibName: "Test", bundle: nil)
}
Run Code Online (Sandbox Code Playgroud)
错误: