我正在开发一个Swift metawear(mbientlab.com)项目,所有代码示例都在Objective C中,因此必须进行大量转换。在这篇博文后发表了http://projects.mbientlab.com/persistent-events-and-filters/ - 我创建了以下继承自MBLRestorable(实现NSCoder协议)的类:
class DeviceConfiguration:NSObject, MBLRestorable {
var pulseWithEvent:MBLEvent!
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.pulseWithEvent, forKey: "pulseWithEvent")
}
required init(coder aDecoder: NSCoder) {
super.init()
self.pulseWithEvent = aDecoder.decodeObjectForKey("pulseWithEvent") as MBLEvent
}
}
到目前为止一切顺利。现在我将以下Objective C转换为Swift:
[self.device setConfiguration:[[DeviceConfiguration alloc] init] handler:^(NSError *error) {
if (!error) {
// Programming successful!
}
}];
我试试:
self.device.setConfiguration(MetawearConfig()) { error in
}
但是得到一个错误,它缺少必需的参数“编码器”。让我觉得它需要init上的参数,但是在Objective C示例代码/应用程序中,编码器obj永远不会被传入(并且编译器不会引发相同的错误)。
setConfiguration的声明是:
- (void)setConfiguration:(id<MBLRestorable>)configuration handler:(MBLErrorHandler)handler;
我缺少什么?
答案 0 :(得分:1)
您正在致电//= require angular-rails-templates
//= require_tree .
angular.module('d-angular', ['templates'])
,但您提供的唯一MetawearConfig()
是init
。如果您需要非参数init(coder aDecoder: NSCoder)
,则必须提供一个:
init
答案 1 :(得分:0)
Objective-C中的var table = document.getElementById("table");
var images = table.getElementsByTagName("img");
var canvas = document.getElementById("lines");
var ctx = canvas.getContext("2d");
var x, y; // Remember coordinates
canvas.width = table.offsetWidth;
canvas.height = table.offsetHeight;
function connect( image ) {
var im = new Image();
im.onload = function(){ // make sure image is loaded
var tabBcr = table.getBoundingClientRect();
var imgBcr = image.getBoundingClientRect();
ctx.beginPath();
ctx.moveTo(x, y);
x = imgBcr.left + (image.parentNode.offsetWidth / 2) - tabBcr.left;
y = imgBcr.top + (image.parentNode.offsetHeight / 2) - tabBcr.top;
ctx.lineTo(x, y);
ctx.stroke();
};
im.src = images[i].src;
}
for(var i=0; i<images.length; i++){
connect( images[i] );
}
也有一个不同的DeviceConfiguration
,没有参数,继承自init
。您要转换的代码看起来是调用无参数版本而不是NSObject
版本。