【问题标题】:Init a computed variable初始化一个计算变量
【发布时间】:2016-11-25 02:52:36
【问题描述】:

我要创建一个新类,在这个类中有一个计算变量;所以我正在寻找一种方法来初始化这个变量:

import UIKit

class Squadra: NSCoder, NSCoding
{
    var nomeSquadra: String
    var numeroCoriSquadra: Int
    var coloreSquadra: String
    var immagineSquadra: String

    var sottotitoloSquadra: String
    {
        get
        {
            return "I migliori cori: \(nomeSquadra)"
        }
    }

    init(nome: String, numero: Int, colore: String, immagine: String, sottotitolo: String)
    {
        nomeSquadra = nome
        coloreSquadra = colore
        numeroCoriSquadra = numero
        immagineSquadra = immagine
        sottotitoloSquadra = sottotitolo
    }
}

显然使用这行代码 Xcode 给了我一个编译错误(因为 var 是一个 get only 属性)。 我认为我必须使用 set 来使 var 可写,但我不知道如何操作,因为我不知道 get 和 set 是如何工作的。

【问题讨论】:

    标签: swift properties var computed-properties


    【解决方案1】:

    要么删除sottotitoloSquadra = sottotitolo,要么分配给不同的变量。即使分配有效,您也永远不会真正将作为 sottotitolo 传入的值用于任何事情。

    【讨论】:

      【解决方案2】:

      当您使用独立属性 nomeSquadra 并尝试同时为 sottotitoloSquadra 设置设置器时,我看不到有用的行为。在您的情况下,对计算变量使用隐藏的支持属性可能会更好?

      private var _sottotitoloSquadra: String
      var sottotitoloSquadra: String
      {
          get
          {
              return "I migliori cori: \(_sottotitoloSquadra)"
          }
          set
          {
              _sottotitoloSquadra = newValue
          }
      }
      
      init(nome: String, numero: Int, colore: String, immagine: String, sottotitolo: String)
      {
          //...
          _sottotitoloSquadra = sottotitolo
      }
      

      【讨论】:

      • 这很接近,但请记住 sotto 计算变量是只读的,因此最好删除 set 部分。初始化部分很好。
      【解决方案3】:

      如果我对你的分类理解正确,你想在 init() 没有提供值时使用变量的默认字符串(不过我只是在猜测)。

      因此,如果团队没有特定的子标题,您可以根据团队的名称来编造一个。

      我也了解您不希望在实例化对象后修改该属性。

      如果是这种情况,(我假设您会得到一个空字符串来表示 sottotitolo),您可以定义一个私有变量来保存提供的标题并使用计算变量公开它。如果在 init() 中未提供标题,则该计算变量可以返回默认值(组成的标题)。

       class Squadra
       {
           var nomeSquadra: String
           var numeroCoriSquadra: Int
           var coloreSquadra: String
           var immagineSquadra: String
      
           private var _sottotitoloSquadra = ""  
           var sottotitoloSquadra: String 
           { 
             return _sottotitoloSquadra == "" 
                  ? "I migliori cori: \(nomeSquadra)" 
                  : _sottotitoloSquadra
           }
      
           init(nome: String, numero: Int, colore: String, immagine: String, sottotitolo: String)
           {
               nomeSquadra = nome
               coloreSquadra = colore
               numeroCoriSquadra = numero
               immagineSquadra = immagine
               _sottotitoloSquadra = sottotitolo
           }
       }
      

      只有你的类,包括它的 init() 函数,才能修改保存提供的 sottotitolo 的私有变量。在该源文件之外,根本无法访问私有变量。

      【讨论】: