草庐IT

immutability

全部标签

arrays - 如何在 Swift 的变量存储属性中存储不可变数组?

我希望我的类有一个可以分配给不可变数组的存储属性。如果我这样做:classMyClass{varmyItems:[String]}我可以为我的属性分配不同的数组,但数组是可变的。如果我这样做:classMyClass{letmyItems:[String]}我的数组是不可变的,但我永远无法更改分配给它的内容。有什么办法可以让我的蛋糕不发生变异吗?我想出的最好办法是围绕数组创建一个包装器,然后将该类型用于属性,如下所示:classMyClass{structImmutableWrapper{letarray:[String]}varmyItems:ImmutableWrapper}...

arrays - forEach 结果 $0 is immutable error

protocols.forEach{$0.prop=nil}结果:Cannotassigntoproperty:'$0'isimmutable我解决了这个问题:protocols.forEach{varprotocol=$0protocol.prop=nil}但是为什么编译器可以接受呢?我希望它能解决这个问题。 最佳答案 您有一组实现协议(protocol)的项目。如果你不告诉Swift这是一个AnyObject协议(protocol)(或早期版本的Swift中的class协议(protocol)),它会假定它可以通过一个实现>结构

arrays - forEach 结果 $0 is immutable error

protocols.forEach{$0.prop=nil}结果:Cannotassigntoproperty:'$0'isimmutable我解决了这个问题:protocols.forEach{varprotocol=$0protocol.prop=nil}但是为什么编译器可以接受呢?我希望它能解决这个问题。 最佳答案 您有一组实现协议(protocol)的项目。如果你不告诉Swift这是一个AnyObject协议(protocol)(或早期版本的Swift中的class协议(protocol)),它会假定它可以通过一个实现>结构

string - Swift "mutable"字符串真的是可变的,还是它们就像 Java 字符串一样?

在TheSwiftProgrammingLanguage中关于字符串的部分,字符串可变性小节中,它是这样说的:YouindicatewhetheraparticularStringcanbemodified(ormutated)byassigningittoavariable(inwhichcaseitcanbemodified),ortoaconstant(inwhichcaseitcannotbemodified):并给出示例代码:varvariableString="Horse"variableString+="andcarriage"//variableStringisnow"

string - Swift "mutable"字符串真的是可变的,还是它们就像 Java 字符串一样?

在TheSwiftProgrammingLanguage中关于字符串的部分,字符串可变性小节中,它是这样说的:YouindicatewhetheraparticularStringcanbemodified(ormutated)byassigningittoavariable(inwhichcaseitcanbemodified),ortoaconstant(inwhichcaseitcannotbemodified):并给出示例代码:varvariableString="Horse"variableString+="andcarriage"//variableStringisnow"

Swift 使方法参数可变?

如何在不创建额外变量的情况下处理这个错误?funcreduceToZero(x:Int)->Int{while(x!=0){x=x-1//ERROR:cannotassignto'let'value'x'}returnx}我不想创建额外的变量来存储x的值。甚至可以做我想做的事吗? 最佳答案 如其他答案所述,从Swift3开始,将var放在不推荐使用的变量之前。尽管其他答案中未说明能够声明inout参数。想想:传递一个指针。funcreduceToZero(_x:inoutInt){while(x!=0){x=x-1}}vara=3r

Swift 使方法参数可变?

如何在不创建额外变量的情况下处理这个错误?funcreduceToZero(x:Int)->Int{while(x!=0){x=x-1//ERROR:cannotassignto'let'value'x'}returnx}我不想创建额外的变量来存储x的值。甚至可以做我想做的事吗? 最佳答案 如其他答案所述,从Swift3开始,将var放在不推荐使用的变量之前。尽管其他答案中未说明能够声明inout参数。想想:传递一个指针。funcreduceToZero(_x:inoutInt){while(x!=0){x=x-1}}vara=3r

c# - 为什么 C# 数字类型是不可变的?

为什么int和double是不可变的?每次要更改值时返回一个新对象的目的是什么?我问的原因是因为我正在制作一个类:BoundedInt,它有一个值和一个上限和下限。所以我想知道:我是否也应该使这种类型不可变?(或者它应该是一个struct吗?) 最佳答案 首先:Whatisthepurposeofreturninganewobjecteachtimeyouwanttochangethevalue?我认为您可能误解了值类型的工作原理。这并不像您想象的那样昂贵的操作;它只是数据的覆盖(与动态分配新内存相反)。其次:这里有一个非常简单的例

c# - 为什么 C# 数字类型是不可变的?

为什么int和double是不可变的?每次要更改值时返回一个新对象的目的是什么?我问的原因是因为我正在制作一个类:BoundedInt,它有一个值和一个上限和下限。所以我想知道:我是否也应该使这种类型不可变?(或者它应该是一个struct吗?) 最佳答案 首先:Whatisthepurposeofreturninganewobjecteachtimeyouwanttochangethevalue?我认为您可能误解了值类型的工作原理。这并不像您想象的那样昂贵的操作;它只是数据的覆盖(与动态分配新内存相反)。其次:这里有一个非常简单的例

c# - 如果委托(delegate)是不可变的,为什么我可以做 x += y 这样的事情?

阅读C#InDepth,第2版,第2.1.2节关于合并和删除委托(delegate)。小节标题指出“委托(delegate)是不可变的”并且“关于它们的任何内容都不能更改”。不过,在下一段中,它讨论了使用像这样的结构x+=y;其中x和y是兼容委托(delegate)类型的变量。我不是刚刚更改了x吗?或者当我这样做时(即立即)处置x时,不变性部分是否处理? 最佳答案 这就像做:stringx="x";stringy="y";x+=y;字符串也是不可变的。上面的代码没有更改字符串objects-它将x设置为不同的值。您需要区分变量和对象