繁体   English   中英

Swift-数组不能转换为UInt8吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM