常量'spacesLeft'推断为类型'()',这可能是意外的Swift

时间:2017-07-20 15:19:33

标签: ios swift xcode swift3 xcode8

我正在使用Xcode 8和Swift构建一个带有AI的Tic Tac Toe游戏。以下是我正在使用的导致错误的相关变量:

var allSpaces: Set<Int> = [1,2,3,4,5,6,7,8,9]
var playerOneMoves = Set<Int>()
var playerTwoMoves = Set<Int>()
var nextMove: Int? = nil

在定义AI将如何发挥作用的函数中,存在以下变量:

var count = 0

let spacesLeft = allSpaces.subtract(PlayerOneMoves.union(playerTwoMoves))

后者导致编译器警告:

  

常量'spacesLeft'推断为类型'()',这可能是意外的

下面有一句if语句:

if allSpaces.subtract(playerOneMoves.union(playerTwoMoves)).count > 0 {
nextMove = spacesLeft[spacesLeft.startIndex.advancedBy(Int(arc4random_uniform(UInt32(spacesLeft.count))))]

}

条件会出现以下错误:

  

元组类型'()'的值没有成员'count'

该陈述给出以下错误:

  

类型'()'没有下标成员

我正在努力寻找解决方案。

4 个答案:

答案 0 :(得分:2)

subtract修改了Set并且没有返回值,您想使用subtracting

答案 1 :(得分:1)

对于第一个警告,subtract会返回Void,因此请使用subtracting

let spacesLeft = allSpaces.subtracting(playerOneMoves.union(playerTwoMoves))

对于第二个错误,不推荐使用advancedBy,您可以更改为:

if spacesLeft.count > 0 {
    nextMove = spacesLeft[spacesLeft.index(spacesLeft.startIndex, offsetBy: Int(arc4random_uniform(UInt32(spacesLeft.count))))]
}

答案 2 :(得分:0)

Set.subtract是一个变异函数,因此它会修改Set,其返回值为Void,这只是空元组的类型别名{{1}因此警告。

您应该致电(),这是Set.substracting的非变异版本并返回subtract

答案 3 :(得分:0)

subtract(_:)函数是一个变异函数,所以它会改变你使用的Set来调用函数。

来自Apple Docs

  

subtract(_:)

     

从此集合中删除给定集合的元素。

您获取错误的原因是因为此函数返回Void,其中Swift是空元组(from Swift's source code)的类型。由于Void没有下标也没有count属性/变量可以获得这些错误。

也许您应该查看subtracting(_:)函数,该函数返回不同的Set

来自Apple Docs

  

subtracting(_:)

     

返回一个新集合,其中包含未在给定集合中出现的此集合的元素。