【问题标题】:Error: Cannot assign to '...' in 'self'错误:无法分配给“自我”中的“...”
【发布时间】:2015-06-22 00:56:15
【问题描述】:

我有这个代码

import UIKit

class SliderControllerView: UIView{
    private let type: ControlType!
    private let label: UILabel!
    private let slider: UISlider!
    private weak var delegate: SliderControllerDelegate?

    private let defaults: SliderDefaults!

    convenience init(type: ControlType, defaults: SliderDefaults, delegate: SliderControllerDelegate?) {

        self.init()

        self.type = type
        self.delegate = delegate
        self.defaults = defaults

        setTranslatesAutoresizingMaskIntoConstraints(false)

        label = UILabel()
        configureLabel()

        slider = UISlider()
        configureSlider(slider)

        SliderDefaults.set(slider, defaults: defaults)

        if let valueFromDetauls = userDefaultsValue {
            slider.value = Float(valueFromDetauls)
        }

        saveValueInUserDefaults()
        updateLabel()
    }

错误信息:

  1. 无法在“self”中分配给“type”
  2. 无法分配给“self”中的“defaults”
  3. 无法分配给“self”中的“label”
  4. 无法分配给“self”中的“slider”

我做什么? 谢谢!

【问题讨论】:

  • 你的意思是super.init() 对吧?
  • 当我使用 super.init() 时,出现错误“必须调用超类 'UIView' 的指定初始化程序”
  • 如果您不想设置框架,则应致电super.init(frame: CGRectZero)。如果您调用self.init(),它将一遍又一遍地递归调用init
  • 我得到错误:属性 'self.type' 未在 super.init 调用时初始化 不可变值 'self.type 只能初始化一次 不可变值 'self.defaults' 只能初始化一次 不可变值“self.label”只能被初始化一次不可变值“self.slider”只能被初始化一次
  • 你应该在所有的类变量都初始化之后调用super.init

标签: swift initialization uikit init


【解决方案1】:

我对代码进行了一些修改,因此它可以编译,尽管它确实改变了一些含义。

class SliderControllerView: UIView {

    // Converted "let" to "var"
    private var type: ControlType!
    private var label: UILabel!
    private var slider: UISlider!
    private weak var delegate: SliderControllerDelegate?

    private var defaults: SliderDefaults!

    // Added frame to init
    convenience init(frame: CGRect, type: ControlType, defaults: SliderDefaults, delegate: SliderControllerDelegate?) {

        // Call designated init(frame: CGRect) for UIView
        self.init(frame: frame)
        self.type = type
        self.delegate = delegate
        self.defaults = defaults

        setTranslatesAutoresizingMaskIntoConstraints(false)

        label = UILabel()
        configureLabel()

        slider = UISlider()
        configureSlider(slider)

        SliderDefaults.set(slider, defaults: defaults)

        if let valueFromDetauls = userDefaultsValue {
            slider.value = Float(valueFromDetauls)
        }

        saveValueInUserDefaults()
        updateLabel()
}

【讨论】:

    【解决方案2】:

    你不能在swift中设置let属性的值,所以请将它们设为var属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多