[英]Swift - Array is not convertible to UInt8?
由于某种原因,我收到了以下代码的编译错误:
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)
, visitedBlocks.append(block)
出现以下编译错误:
“类型'[Block]'的不变值仅具有名为'append'的变异成员
我还尝试了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
}
有任何想法吗?
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.