Swift - 数组不能转换为UInt8?

时间:2014-07-16 04:11:18

标签: arrays append swift

出于某种原因,我使用以下代码收到编译错误:

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
}

有什么想法吗?

1 个答案:

答案 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)