首页 \ 问答 \ 有没有更好的方法来使用Ext.apply将子/子对象组合到另一个对象中?(Is there a better way to use Ext.apply to combine child/subobjects into another object?)

有没有更好的方法来使用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
更新时间:2023-07-01 21:07

最满意答案

这将工作:

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.

相关问答

更多
  • 您可以创建一个计划的计时器,它自动将自身添加到运行循环并开始触发: 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 ...
  • 几个笔记: 1)一般的想法是你需要在一个合理的位置设置一个计时器 - viewWillAppear是一个常见的位置,并且在视图不再显示时记得使它无效 (如在viewWillDisappear )。 如果不这样做可能会导致内存增长,因为运行循环对目标有强烈的引用 - 在本例中为self 。 我建议将您的NSTimer.scheduledTimer...调用移动到viewWillAppear 。 2)上面的animation代码非常简单。 基本上,您需要获取当前的“页面”,找出下一个“页面”应该是什么,然后让您 ...
  • 计时器对其目标(自我)有很强的参考。 目标被安排到运行循环中,该循环持有一个强烈的参考,直到定时器失效。 直到您使计时器无效(reloadTimer.invalidate,或者可能来自loadSecurityTradeInfo方法内),对象不会消失。 这实际上是非常好的,因为定时器向对象发送loadSecurityTradeInfo消息在对象消失后将是一个非常非常糟糕的主意。 loadSecurityTradeInfo可能应该更改为一个将计时器作为参数的方法,因此它可以使其失效。 The timer has ...
  • 这应该工作(请注意,我更改了一些函数名称以更加遵循约定): @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 ...
  • 该错误看起来像是错误的。 (从Swift获得的错误信息通常与问题的真正原因完全无关,只是告诉你“这条线路有问题。弄清楚它是什么修复它。”这会比这样的错误更好。 ,至少那时你不会认为错误信息实际上提供了有用的信息。) NSTimer.scheduledTimerWithTimeInterval方法希望间隔值为double。 假设我对正确的问题是正确的,你可以将你的函数更改为将double作为double,或者在调用NSTimer.scheduledTimerWithTimeInterval将其转换为doubl ...

相关文章

更多

最新问答

更多
  • 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
  • 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
  • OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
  • 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
  • codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
  • 在计算机拍照在哪里进入
  • 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
  • No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
  • 单页应用程序:页面重新加载(Single Page Application: page reload)
  • 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
  • System.StackOverflow错误(System.StackOverflow error)
  • KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
  • 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
  • android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
  • TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
  • 企业安全培训的各项内容
  • 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
  • C#类名中允许哪些字符?(What characters are allowed in C# class name?)
  • NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
  • 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
  • 将多个行和可变行移动到列(moving multiple and variable rows to columns)
  • 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
  • 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
  • Angular $资源不会改变方法(Angular $resource doesn't change method)
  • 在Angular 5中不是一个函数(is not a function in Angular 5)
  • 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
  • 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
  • 常见的python rpc和cli接口(Common python rpc and cli interface)
  • Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
  • 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)