【问题标题】:How to initialize unowned stored properties in a swift subclass?如何在 swift 子类中初始化无主存储属性?
【发布时间】:2015-05-05 04:08:31
【问题描述】:

我有一个 UICollectionViewController 的自定义 swift 子类,它具有属性 unowned var mainController。我不知道如何初始化这个属性。如果我在调用super.init 之前尝试对其进行初始化,Xcode 会抱怨在 super.init 之前使用了“self”。如果我之后尝试对其进行初始化,Xcode 会抱怨在 super.init 调用时未初始化属性“self.mainController”。

一般来说,swift中是否可以将无主变量作为子类的属性?

class CustomCollection: UICollectionViewController {

    unowned var mainController: MainController

    convenience init(mainController: MainController) {
        var collectionViewLayout = UICollectionViewLayout()
        self.mainController = mainController
        self.init(collectionViewLayout: collectionViewLayout)
    }

    override init(collectionViewLayout layout: UICollectionViewLayout) {
        super.init(collectionViewLayout: layout)
    }
    ...
}

【问题讨论】:

  • 只有一个 init 方法用于设置 mainController 的值或在调用 super.init 之前在所有 init 方法中初始化 mainController。

标签: swift


【解决方案1】:

这似乎在我的游乐场文件中工作......

class Fruit {

    var taste:String

    init(){
        taste = "sweet"
    }

    deinit{
        println("Deinitializing Fruit")
    }
}

class Apple:Fruit{

    let color: UIColor
    unowned var meme:NSObject

    override init () {
        color = UIColor.greenColor()
        meme = "The Big Apple"
        super.init()
    }

    convenience init ( newMemeValue: AnyObject) {
        self.init()
        self.meme = newMemeValue as! NSObject
    }
}

var redApple:Apple?
redApple = Apple(newMemeValue: "A Bigger Bite")
println("\(redApple)")
var color = redApple!.color

【讨论】:

    【解决方案2】:

    感觉不是最好的解决方案,但这就是我最终要做的:

    class CustomCollection: UICollectionViewController {
    
        unowned var mainController = MainController()
    
        convenience init(mainController: MainController) {
            var collectionViewLayout = UICollectionViewLayout()
            self.init(collectionViewLayout: collectionViewLayout)
            self.mainController = mainController
        }
    
        override init(collectionViewLayout layout: UICollectionViewLayout) {
            super.init(collectionViewLayout: layout)
        }
    

    在 MainController 中:

    class MainController: UIViewController {
    
        lazy var customCollection: CustomCollection = CustomCollection(mainController: self)
    
        init () {
            ...
        }
        ...
    }
    

    @Shoaib 是正确的,mainController 需要在所有 init 函数中进行初始化,所以我只是在顶部初始化它并在调用 super.init() 后再次设置它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多