继这个问题之后: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来扼杀我的生产力.
我是否遗漏了某些事情或预期会出现这种精神分裂症行为?
如果是这样,那么将修改后的数据传回去的最佳做法是什么?
我有点困惑 - 我认为我理解Optionals并且在Apple开发论坛Chris L上,提到了对不可变的可选问题的解决方法是为可选的值类型创建一个类包装器.- 链接!
但是以UIWindow(具有各种属性的可选类类型)为例
使用可选链接,这些属性似乎仍然不可变!
var window: UIWindow?
//this works (force unwrap)
self.window!.backgroundColor = UIColor.greenColor()
//this optional chain doesn't work... why not? Isn't this just a safer version of the above?
self.window?.backgroundColor = UIColor.redColor()
Run Code Online (Sandbox Code Playgroud)
这似乎是在beta 5中修复的!
我对OO编程和Swift有相当好的理解,然而,真正让我感到困惑的一个领域是Generators and Sequences(顺便提一下我对协议的概念很好).
例如,我从Swift指南(Apple)完成了这个练习
"EXPERIMENT修改anyCommonElements函数,使函数返回任意两个序列共有的元素数组."
转过来:
func? ?anyCommonElements? <?T?, ?U? ?where? ?T?: ?SequenceType?, ?U?: ?SequenceType?, ?T?.?Generator?.?Element?: ?Equatable?, ?T?.?Generator?.?Element? == ?U?.?Generator?.?Element?> (?lhs?: ?T?, ?rhs?: ?U?) -> ?Bool? {
for? ?lhsItem? ?in? ?lhs? {
for? ?rhsItem? ?in? ?rhs? {
if? ?lhsItem? == ?rhsItem? {
return? ?true
}
}
}
return? ?false
}
Run Code Online (Sandbox Code Playgroud)
进入:
func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, rhs: U) -> [T.Generator.Element]? {
var commonElements:[T.Generator.Element]? = nil
for lhsItem …Run Code Online (Sandbox Code Playgroud) 这个问题是我的理解,因为我的代码工作正常.我已经查看了SDWebImage,但它相当大,我无法确定我正在质疑的机制是如何工作的.
好吧,假设我有一个充满UIImageViews的桌面视图(每个单元格内部有一个),我在每个单元格中调用SDWebImage类别/扩展,然后从网络上懒惰加载图像.
使用新下载的图像更新屏幕上的单元格,而无需重新加载tableview?
我问这个,因为我很惊讶地发现当使用SDWebImage扩展时,我的每个单元格的imageViews图像一旦下载了相应的图像就会弹出.
我的印象是我必须重新加载tableView,但是当图像可用时,每个单元格imageView'自动'更新!
这是如何运作的?SDWebImage是否保留对它正在使用的每个cell/imageView的引用?
如何在界面构建器中创建自定义UIView(包含许多子视图,UITextFields等)?
我不希望带有NIB的viewController只是一个简单的UIView,有很多子视图,在IB中创建,然后我可以只分配init和use,这可能吗?
只是想知道创建手动数组的最佳方法,不使用NSMutalbleArray,我一直在研究最好的解决方案,但没有优雅的答案,你怎么看,在Objective C中,什么是从头开始创建NSMutableArray样式对象的最佳方法?使用FIFO队列作为最终解决方案,即使是基本的阵列结构也是一个很好的提示!谢谢,约翰
我知道之前已经问过类似的问题类型,但我正试图达到一个特定的效果:
我明白我可以听,
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
Run Code Online (Sandbox Code Playgroud)
并自己处理通知,但我不只是想显示自定义警报或UIAlertView,
我实际上希望UILocalNotification能够在应用程序处于后台时显示.即

我之所以喜欢这样,是因为它本身就发出了声音,横幅看起来很漂亮.
有什么想法吗?
问候,约翰
今晚一直在关注iOS 7 SDK,有一件事我注意到,他们是否已经在iOS 7中为iPhone模拟器删除了iPhone"皮肤"?我似乎只能选择,iPhone 3.5/4英寸Retina或iPad/iPad Retina,它们都只有黑色边框,我更喜欢用皮肤模拟器测试非视网膜,因为它的速度更快,任何想法如何获得它背部?
我想知道是否有人能指出我在iPhone5S及以上版本中使用M7芯片的正确方向.
我想知道它是否只是在您使用通用核心运动API时自动使用,或者是否有一组特定的API可供使用?
最后我注意到在线阅读一些文章,它保留了一些历史运动数据,任何人都知道如何访问这个或任何人都可以指出我正确的方向?
当我创建两个这样的类时:
class Example
{
}
class OtherExample
{
init() {
println("created")
}
}
var instance = Example()
var otherInstance = OtherExample()
Run Code Online (Sandbox Code Playgroud)
两者似乎都创建了可用的实例,所以我想知道,如果您不提供init方法,而您如上所述进行初始化,那么Swift中的区别是什么?
我确实认为它可能会自动调用超类init,但是由于这两个对象都不是从NSObject继承的,所以它们没有超类吗?
还需要super.init()在otherExample中进行分类吗?
ios ×8
swift ×4
objective-c ×3
cocoa-touch ×2
ios7 ×2
iphone ×2
xcode ×2
api ×1
apple-m7 ×1
arrays ×1
core-motion ×1
generator ×1
ios8 ×1
lazy-loading ×1
sdwebimage ×1
sequence ×1
uiimageview ×1
uikit ×1
uitableview ×1
xcode5 ×1