这是一个两部分问题,所有关于原子性std::shared_ptr:
1.
据我所知,std::shared_ptr是唯一的智能指针<memory>这就是原子.我想知道是否有非原子版本std::shared_ptr可用(我看不到任何内容<memory>,所以我也接受标准之外的建议,比如Boost中的建议).我知道boost::shared_ptr也是原子的(如果BOOST_SP_DISABLE_THREADS没有定义),但也许有另一种选择?我正在寻找具有相同语义std::shared_ptr但没有原子性的东西.
2.我明白为什么std::shared_ptr是原子的; 这有点好.然而,对于每种情况来说都不是很好,而且C++历来有"只为你使用的东西买单"的口号.如果我没有使用多个线程,或者我使用多个线程但是没有跨线程共享指针所有权,则原子智能指针是过度的.我的第二个问题是为什么不是std::shared_ptrC++ 11 中提供的非原子版本?(假设有一个原因)(如果答案是简单的"非原子版本根本不会考虑"或"从来没有人问非原子版"这很好!).
对于问题#2,我想知道是否有人提出过非原子版shared_ptr(无论是对Boost还是标准委员会)(不是替换原子版本shared_ptr,而是与它共存)并且它被击落了具体原因.
如何在Swift中创建不可变数组?
对文档的肤浅解读表明你可以做到
let myArray = [1,2,3]
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,这实际上产生了一个可变的,固定大小的数组.这种可变性创建了常见的谜题,其中包含未预料到的别名和函数,这些谜题会改变其参数:
let outterArray = [myArray, myArray]
outterArray[0][0] = 2000
outterArray //=> [[2000,2,3],[2000,2,3]] surprise!
func notReallyPure(arr:Int[]) -> () { arr[0] = 3000 }
notReallyPure(myArray)
myArray // => [3000,2,3]
Run Code Online (Sandbox Code Playgroud)
没比C好多少
如果我想要不变性,那么最好将它包装NSArray成如此:
let immutableArray = NSArray(myArray: [1,2,3])
Run Code Online (Sandbox Code Playgroud)
这看起来很疯狂.我在这里错过了什么?
更新时间(2015-07-26):
这个问题可以追溯到斯威夫特的早期阶段.从那时起,Swift已经更新,因此不可变数组实际上是不可变的,如下面的答案所示.
继这个问题之后:Swift数组赋值是否不一致(既不是引用也不是深拷贝)?-
我一直在玩Swift中的传递对象并注意到一些奇怪的结果.
为了阐明的那种行为的我是使用于(之前SWIFT)将是目标C的
举一个我的应用程序(用Obj C编写)的例子,我有一个'通知列表'的概念. - 实际上只是一组自定义对象.
在该App中,我经常将我的全局"通知"数组传递给各种viewControllers,这些viewControllers提供用于更新列表的UI.
当我将全局数组传递给子viewController时,我将它分配给收件人对象中的本地数组变量.然后,只需更新/更改本地数组,这些更改就会反映在rootViewController上的全局数组中.我理解这种行为隐含在Objective C中作为通过引用传递的对象,但这非常方便,我一直试图在Swift中复制这种行为.
然而,当我在Swift中重写我的应用程序时,我已经碰壁了.
我首先尝试将一个Swift数组的字符串 (不是NSMutableArray)从rootViewController传递给子viewController(如上所述).
这是在子视图中传递字符串数组时的行为:
我传入:
[比尔,鲍勃,杰克] 然后将这个传递的数组分配给本地数组进行本地修改,
然后我将字符串"Frank"附加到本地数组
结果是:
本地数组 = [比尔,鲍勃,杰克,弗兰克]
全球阵列 = [比尔,鲍勃,杰克]
对本地数组的更改不会反映回全局数组.- 更改元素时发生相同的结果(不更改数组的长度.)
我还尝试了一个更真实世界的例子 - 将一个自定义'notification'对象的数组传递给子viewController.该SAME结果与发生没有变化到自定义对象的本地分配的阵列被反射到在通过原始的全局阵列.
这种行为对我来说是不可取的,我假设这里的最佳做法是使用委托协议将修改后的数组(或任何对象)传递回父对象,然后手动更新全局数组? - 如果是这样,这会在Objective C样式行为上产生相当多的工作量.
最后我尝试了inout关键字,它有效地让你直接修改传递给目标对象的函数参数var.
更改将反映回全局数组(或对象)但问题是,如果将输入参数分配给局部变量(要在init函数的范围之外进行编辑),对局部变量的更改仍未反映在全局范围内.
我希望上面的内容是有道理的 - 用Swift来扼杀我的生产力.
我是否遗漏了某些事情或预期会出现这种精神分裂症行为?
如果是这样,那么将修改后的数据传回去的最佳做法是什么?