2014-09-28 29 views
3

我试图执行下面的代码,并得到错误Could not find member 'subscript上Xcode6找不到成员标

var b:[[Float]] = [[1,2]] 

var i2 = 0 // second to last control point 
var pointIm1 = CGPoint(x: 0.0,y: 0.0) 
var pointI = CGPoint(x: 0.0,y: 0.0) 
var pointIp1 = CGPoint(x: 0.0,y: 0.0) 
var px:Float = b[0][0] * Float(pointIm1.x) + b[0][0] * Float(pointI.x) + b[0][0] + b[0][0] * Float(pointIp1.x) 

任何人有想法,为什么是给错误

编辑:不要任何人有更好的主意还是我需要为每个标创建不同的变量内特在他的回答表明

//not looks good 
var bj0 = b[j][0] 
var bj1 = b[j][1] 
var bj2 = b[j][2] 
var bj3 = b[j][3] 


var px:Float = bj0 * Float(pointIm1.x) + bj1 * Float(pointI.x) + bj2 + bj3 * Float(pointIp1.x) 

回答

2

这是不符合标一个问题 - 斯威夫特陷入困境当试图解析像你的最后一行那样的更长的多项表达式时。在操场上,我得到这个错误:

expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

你需要重构该行突破这个限制 - 是这样的:

let b00 = b[0][0] 
var px: Float = b00 * Float(pointIm1.x) + b00 * Float(pointI.x) + b00 + b00 * Float(pointIp1.x) 

你很可能只是把它分解成两个步骤,像这样:

var px:Float = bj0 * Float(pointIm1.x) + bj1 * Float(pointI.x) 
px += bj2 + bj3 * Float(pointIp1.x) 
+0

我越来越'无法找到成员'下标'是否有任何问题表达式然而,如果我从表达式中删除'b [0] [0] * Float(pointIp1.x)'工作正常 – codester 2014-09-28 18:49:20

+0

我在操场上遇到了两个错误 - 代码没有问题,编译器无法处理它。不幸的是,你需要解决这个编译器错误。 – 2014-09-28 18:50:23

+0

我猜编译器在推断嵌套数组的类型时不好,所以首先分配一个局部变量来解决这个问题。 – 2014-09-28 18:52:28

1

它看起来像一个编译器错误。我想这个表达式(从你得到的,删除所有乘法):

var px:Float = b[0][0] + b[0][0] + b[0][0] + b[0][0] 

和失败,而这一点:

var px:Float = b[0][0] + b[0][0] + b[0][0] 

作品。

因此,内特库克的答案是正确的,这是编译器陷入困境。

更多的测试 - 用一维数组,这个工程:

var c:[Float] = [1.0, 2.0] 
var px2: Float = c[0] + c[0] + c[0] + c[0] + c[0] 

但这并不

var px2: Float = c[0] + c[0] + c[0] + c[0] + c[0] + c[0] // Cannot invoke '+' with arguments of type '($T28, $T32)' 

注意,你的表达可以被重构为:

var px:Float = b[0][0] * (Float(pointIm1.x) + Float(pointI.x) + 1.0 + Float(pointIp1.x))