在Objective-C中,我经常传递块.我经常使用它们来实现模式,以帮助避免将内容存储到实例变量中,从而避免线程/时序问题.
例如,我将它们分配给一个CAAnimation
via,-[CAAnimation setValue:forKey:]
这样我就可以在动画结束时执行该块.(Objective-C中可以把块作为对象,你也可以做[someBlock copy]
和[someBlock release]
.)
但是,尝试在Swift和Objective-C中使用这些模式似乎非常困难.(编辑:我们可以看到语言仍在变化:已经调整了代码,因此它适用于Xcode6-beta2,之前的版本适用于Xcode6-beta1.)
例如,我无法转换AnyObject
回块/闭包.以下产生编译器的错误:
override func animationDidStop(anim: CAAnimation!, finished flag: Bool)
{
let completion : AnyObject! = anim.valueForKey("completionClosure")
(completion as (@objc_block ()->Void))()
// Cannot convert the expression's type 'Void' to type '@objc_block () -> Void'
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个解决方法,但它非常难看,恕我直言:在我的桥接标题中,我有:
static inline id blockToObject(void(^block)())
{
return block;
}
static inline void callBlockAsObject(id block)
{
((void(^)())block)();
}
Run Code Online (Sandbox Code Playgroud)
现在我可以在Swift中做到这一点:
func someFunc(completion: (@objc_block ()->Void))
{
let animation = CAKeyframeAnimation(keyPath: "position")
animation.delegate …
Run Code Online (Sandbox Code Playgroud) DO,PROG等在它们的身体周围建立一个名为nil的隐式块.CLHS不提供执行此操作的所有标准宏的列表.到目前为止我所知道的:
DO
DO*
PROG
PROG*
LOOP
DOLIST
DOTIMES
DO-SYMBOLS
DO-ALL-SYMBOLS
DO-EXTERNAL-SYMBOLS
Run Code Online (Sandbox Code Playgroud)
是否有任何其他标准CL宏或特殊形式建立隐式nil块?
我们的想法是在一个页面上有多个小部件,并包含这个'小部件'所需的所有js和css文件(以这种方式管理文件很容易).重复的文件不是问题.每个小部件的模板都包含在页面中{%include%}从小部件的模板中我试图将内容添加到父级的块中:
家长:
{%block js%}
{%endblock%}
Run Code Online (Sandbox Code Playgroud)
WIDGET
{%block js%}
{{block.super}}
///my widget spectyfic JS
{%end block%}
Run Code Online (Sandbox Code Playgroud)
这是一个错误 {{block.super}}: Caught AttributeError while rendering: 'BlockNode' object has no attribute 'context'
我不确定我怎么能延长阻止...似乎这在django中是不可能的......任何想法?定义多个块将无法正常工作,因为我们不知道有多少不同的小部件,每个页面上都有我们的名字...(而且这不是一个nemplate的担心)
我对python比较陌生我想为一个类只运行一次代码块.就像java中的静态块一样.
例如:
class ABC:
execute this once for a class.
Run Code Online (Sandbox Code Playgroud)
python中有没有这样的选项?
在java中我们这样写.在加载类时,只对类执行一次.不是每个对象创建
public class StaticExample{
static {
System.out.println("This is first static block");
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢
声明一个返回Objective-C块的C函数的语法是什么?可能吗?
我认为应该是这样的
(void (^)(void)) myFunctionReturningABlock();
Run Code Online (Sandbox Code Playgroud)
但那不会编译.
任何人都可以帮我弄清楚Ruby中yield和return的使用.我是一个Ruby初学者,所以很简单的例子非常受欢迎.
先感谢您!
左浮动元素(例如和图像)是否显示之间是否存在实际差异:内联块; 适用于它,而不是保留默认显示:block; 适用规则?
换句话说,有什么区别:
<div style="float: left; display: inline-block;">text</div>
Run Code Online (Sandbox Code Playgroud)
和
<div style="float: left; display: block;">text</div>
Run Code Online (Sandbox Code Playgroud)
?
举个例子Proc:
proc = Proc.new {|x,y,&block| block.call(x,y,self.instance_method)}
Run Code Online (Sandbox Code Playgroud)
它需要两个参数,x和y,以及一个块.
我想使用不同的self值来执行该块.像这样的东西几乎可以工作:
some_object.instance_exec("x arg", "y arg", &proc)
Run Code Online (Sandbox Code Playgroud)
但是,这不允许您传入一个块.这也行不通
some_object.instance_exec("x arg", "y arg", another_proc, &proc)
Run Code Online (Sandbox Code Playgroud)
也没有
some_object.instance_exec("x arg", "y arg", &another_proc, &proc)
Run Code Online (Sandbox Code Playgroud)
我不知道还有什么可以在这里工作.这是可能的,如果是这样,你怎么做?
编辑:基本上如果您可以通过更改change_scope_of_proc
方法来传递此rspec文件,您已解决了我的问题.
require 'rspec'
class SomeClass
def instance_method(x)
"Hello #{x}"
end
end
class AnotherClass
def instance_method(x)
"Goodbye #{x}"
end
def make_proc
Proc.new do |x, &block|
instance_method(block.call(x))
end
end
end
def change_scope_of_proc(new_self, proc)
# TODO fix me!!!
proc
end
describe "change_scope_of_proc" do
it "should change the instance method that is called" do …
Run Code Online (Sandbox Code Playgroud)