有没有更好的方法来使用Ext.apply将子/子对象组合到另一个对象中?(Is there a better way to use Ext.apply to combine child/subobjects into another object?)
我试图将对象属性从objA应用到objB,但是我意识到Ext.apply有缺陷(或祝福?),它只以一种方式应用第一级对象。
例:
var objA = { name: 'objA', baseParams: { cols: [1,2,3,4,5] } }; //used in subclass var objB = { name: 'objB', baseParams: { limit: 50, sort: 'name' } }; //used in baseclass var objC = { name: 'objC', baseParams: { as_hash: true, limit: 20 } }; Ext.apply(objB,objA); //used in subclass Ext.apply(objC,objB); //used in baseclass
示例将输出:
obj = { name: 'objA', baseParams: { cols: [1,2,3,4,5] } };
我想这个输出,而不是(预期输出):
obj = { name: 'objA', baseParams: { cols: [1,2,3,4,5], as_hash: true, limit: 50, sort: 'name' } };
没有这样做我怎么能做到这一点?
// subclass: var bpTemp = {}; bpTemp.baseParams = Ext.apply(objB.baseParams, objA.baseParams); Ext.apply(objB,objA); Ext.apply(objB,bpTemp); // base class: var bpTemp = {}; bpTemp.baseParams = Ext.apply(objC.baseParams, objB.baseParams); Ext.apply(objC,objB); Ext.apply(objC,bpTemp);
I'm trying to apply the object properties from objA to objB but I realised Ext.apply is flawed (or blessing?) in a way where it only applies first level objects together.
Example:
var objA = { name: 'objA', baseParams: { cols: [1,2,3,4,5] } }; //used in subclass var objB = { name: 'objB', baseParams: { limit: 50, sort: 'name' } }; //used in baseclass var objC = { name: 'objC', baseParams: { as_hash: true, limit: 20 } }; Ext.apply(objB,objA); //used in subclass Ext.apply(objC,objB); //used in baseclass
Example will output:
obj = { name: 'objA', baseParams: { cols: [1,2,3,4,5] } };
I'd like this output instead (expected output):
obj = { name: 'objA', baseParams: { cols: [1,2,3,4,5], as_hash: true, limit: 50, sort: 'name' } };
How can I achieve this without doing this?
// subclass: var bpTemp = {}; bpTemp.baseParams = Ext.apply(objB.baseParams, objA.baseParams); Ext.apply(objB,objA); Ext.apply(objB,bpTemp); // base class: var bpTemp = {}; bpTemp.baseParams = Ext.apply(objC.baseParams, objB.baseParams); Ext.apply(objC,objB); Ext.apply(objC,bpTemp);
原文:https://stackoverflow.com/questions/5216565
最满意答案
这将工作:
override func viewDidLoad() { super.viewDidLoad() //Swift >=3 selector syntax var timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) //Swift 2.2 selector syntax var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true) //Swift <2.2 selector syntax var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true) } // must be internal or public. @objc func update() { // Something cool }
对于Swift 4,您要获取选择器的方法必须暴露于Objective-C,因此必须将
@objc
属性添加到方法声明中。This will work:
override func viewDidLoad() { super.viewDidLoad() // Swift block syntax (iOS 10+) let timer = Timer(timeInterval: 0.4, repeats: true) { _ in print("Done!") } // Swift >=3 selector syntax let timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) // Swift 2.2 selector syntax let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: #selector(MyClass.update), userInfo: nil, repeats: true) // Swift <2.2 selector syntax let timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true) } // must be internal or public. @objc func update() { // Something cool }
For Swift 4, the method of which you want to get the selector must be exposed to Objective-C, thus
@objc
attribute must be added to the method declaration.
相关问答
更多-
在Swift中使用NSTimer(Using an NSTimer in Swift)[2023-10-21]
您可以创建一个计划的计时器,它自动将自身添加到运行循环并开始触发: NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "timerDidFire:", userInfo: userInfo, repeats: true) 或者,您可以保留当前的代码,并在您准备好时将计时器添加到运行环境中: let myTimer = NSTimer(timeInterval: 0.5, target: self, selector: " ... -
这将工作: override func viewDidLoad() { super.viewDidLoad() //Swift >=3 selector syntax var timer = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.update), userInfo: nil, repeats: true) //Swift 2.2 selector synta ...
-
你有一个计时器试图每隔3到12秒停止音乐。 有时您会创建一个尝试每3秒启动一次音乐的计时器。 有时您会创建更多这些计时器。 因此,最终你有很多很多计时器尝试在随机时间开始和停止音乐。 要停止重复计时器,请调用invalidate。 并且不要像你那样初始化定时器,NSTimer()不会返回任何有用的东西。 只需将变量声明为NSTimer? You have one timer that tries to stop the music every 3 to 12 seconds. And sometimes y ...
-
首先,你的onTimer方法必须声明为@objc ,否则NSTimer不能找到它。 至于你的问题,那是因为你还没有开始运行循环。 为此, CFRunLoopRun()是我认为最简单的解决方案。 import Foundation class MyClass { func startTimer() { NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: "onTimer:", userInfo: n ...
-
AutoLayout正在运行并重置图像的位置。 它正在运行,因为您正在更新您的UILabel 。 有两种方法可以解决这个问题: 禁用AutoLayout OR 将管和管道的位置存储在属性中,然后在viewDidLayoutSubviews()的覆盖中设置它们。 以下是如何实现选项#2的方法: @IBOutlet weak var tube1: UIImageView! @IBOutlet weak var bird1: UIImageView! @IBOutlet weak var score: UILab ...
-
在Swift中使用PageViewController设置NSTimer(Setting up NSTimer with PageViewController in Swift)[2024-03-19]
几个笔记: 1)一般的想法是你需要在一个合理的位置设置一个计时器 - viewWillAppear是一个常见的位置,并且在视图不再显示时记得使它无效 (如在viewWillDisappear )。 如果不这样做可能会导致内存增长,因为运行循环对目标有强烈的引用 - 在本例中为self 。 我建议将您的NSTimer.scheduledTimer...调用移动到viewWillAppear 。 2)上面的animation代码非常简单。 基本上,您需要获取当前的“页面”,找出下一个“页面”应该是什么,然后让您 ... -
计时器对其目标(自我)有很强的参考。 目标被安排到运行循环中,该循环持有一个强烈的参考,直到定时器失效。 直到您使计时器无效(reloadTimer.invalidate,或者可能来自loadSecurityTradeInfo方法内),对象不会消失。 这实际上是非常好的,因为定时器向对象发送loadSecurityTradeInfo消息在对象消失后将是一个非常非常糟糕的主意。 loadSecurityTradeInfo可能应该更改为一个将计时器作为参数的方法,因此它可以使其失效。 The timer has ...
-
Swift NSTimer编码(Swift NSTimer Coding)[2021-10-21]
这应该工作(请注意,我更改了一些函数名称以更加遵循约定): @IBAction func button1Tapped() { button2.setTitle("Text", forState: .Normal) button2.hidden = false NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "hideButton2", userInfo: nil, repeats: false) } ... -
有不同的方法来做到这一点。 一种方法,你可以在按下按钮时将bool值设置为true,然后在updateCountdown检查布尔值。 例如: func updateCountdown() { self.countdown-- if self.countdown == 0 && YOUR_BUTTON_BOOL { self.timer.invalidate() self.timer = nil } let texts: NSArra ...
-
使用NSTimer“let”?(Use NSTimer with “let”?)[2022-03-22]
该错误看起来像是错误的。 (从Swift获得的错误信息通常与问题的真正原因完全无关,只是告诉你“这条线路有问题。弄清楚它是什么修复它。”这会比这样的错误更好。 ,至少那时你不会认为错误信息实际上提供了有用的信息。) NSTimer.scheduledTimerWithTimeInterval方法希望间隔值为double。 假设我对正确的问题是正确的,你可以将你的函数更改为将double作为double,或者在调用NSTimer.scheduledTimerWithTimeInterval将其转换为doubl ...