出于某种原因,我使用以下代码收到编译错误:
func _executeOnBlockAndSurroundingBlocksRecursive(predicate : (block : Block) -> Void,
withBlockCondition conditionPredicate : ((block : Block) -> Bool)?,
withStartBlock start_block : Block?,
withRelativeBlockPositions relativeBlockPositions : [RelativeBlockPosition],
withVisitedBlocks visitedBlocks : [Block])
{
if start_block
{
var block : Block = start_block!
if !visitedBlocks.contains(block)
&& (!conditionPredicate || conditionPredicate!(block: block))
{
visitedBlocks += block //**compile error** - '[Block]' is not convertible to '@lvalue UInt8'
predicate(block: block)
for relativeBlockPosition in relativeBlockPositions
{
var relativePositionedBlock = block.getBlockForRelativeBlockPosition(relativeBlockPosition: relativeBlockPosition)
if relativePositionedBlock
{
_executeOnBlockAndSurroundingBlocksRecursive(predicate, withBlockCondition: conditionPredicate, withStartBlock: relativePositionedBlock, withRelativeBlockPositions: relativeBlockPositions, withVisitedBlocks : visitedBlocks)
}
}
}
}
}
如果我将visitedBlocks += block
更改为visitedBlocks.append(block)
,我会收到以下编译错误:
"类型的不可变值' [Block]'只有名为'追加'
的变异成员我还尝试了inout withVisitedBlocks visitedBlocks: [Block]
方法参数,但这只是给了我这些编译时错误:
func _executeOnBlockTypeGroupingOuterEdges(predicate : (edgeBlock : Block) -> Void, withStartBlock block : Block)
{
_executeOnBlockTypeGroupingOuterEdgesRecursive(predicate, withStartBlock: block, withCurrentBlock: block, withVisitedBlocks: &[]) //**compile error** - '[Block]' is not a subtype of '@lvalue [Block]'
}
func executeOnBlockAndSurroundingBlocksRecursive(predicate : (block : Block) -> Void,
withBlockCondition conditionPredicate : ((block : Block) -> Bool)?,
withStartBlock block : Block,
withRelativeBlockPositions relativeBlockPositions : [RelativeBlockPosition])
{
_executeOnBlockAndSurroundingBlocksRecursive(predicate, withBlockCondition: nil, withStartBlock: block, withRelativeBlockPositions: relativeBlockPositions, withVisitedBlocks : &[]) //**compile error** - Extra argument 'withBlockCondition' in call
}
有什么想法吗?
答案 0 :(得分:0)
Swift中的数组是值类型。这意味着它们在传递给方法时总是被复制。如果您希望能够修改数组并使其影响传入的数组,则必须将参数定义为inout参数:
func _executeOnBlockAndSurroundingBlocksRecursive(predicate : (block : Block) -> Void,
withBlockCondition conditionPredicate : ((block : Block) -> Bool)?,
withStartBlock start_block : Block?,
withRelativeBlockPositions relativeBlockPositions : [RelativeBlockPosition],
inout withVisitedBlocks visitedBlocks : [Block])
当你调用方法时,你必须在数组变量之前加上&
。
Swift更好的约定是返回数组的修改版本作为返回值:
func _executeOnBlockAndSurroundingBlocksRecursive(predicate : (block : Block) -> Void,
withBlockCondition conditionPredicate : ((block : Block) -> Bool)?,
withStartBlock start_block : Block?,
withRelativeBlockPositions relativeBlockPositions : [RelativeBlockPosition],
withVisitedBlocks visitedBlocks : [Block]) -> [Block]
在递归调用中,您将附加到数组的本地副本:
var localCopy = visitedBlocks
localCopy += _executeOnBlockAndSurroundingBlocksRecursive(predicate, withBlockCondition: conditionPredicate, withStartBlock: relativePositionedBlock, withRelativeBlockPositions: relativeBlockPositions, withVisitedBlocks : localCopy)