初始化一个计算变量

Posted

技术标签:

【中文标题】初始化一个计算变量【英文标题】: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 是如何工作的。

【问题讨论】:

【参考方案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 的私有变量。在该源文件之外,根本无法访问私有变量。

【讨论】:

以上是关于初始化一个计算变量的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中,为啥定义变量的时候总是初始化为0呢?该怎么理解。

c#中const与readonly区别

C# const和readonly修饰符的区别

获取计算变量时有时会崩溃

C----框架变量常量赋值复合赋值初始化表达式运算符

Go语言中的变量