我正在使用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'
该陈述给出以下错误:
类型'()'没有下标成员
我正在努力寻找解决方案。
答案 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(_:)
返回一个新集合,其中包含未在给定集合中出现的此集合的元素。