Set не работает несмотря на копирование из документации разработчика - PullRequest
0 голосов
/ 02 февраля 2019

При попытке создать набор я получаю сообщение об ошибке «Невозможно преобразовать значение типа« [Int] »в указанный тип« Набор »».Это происходит, даже несмотря на то, что я пишу код точно так же, как в DD: https://developer.apple.com/documentation/swift/set

var intSet2 : Set = [2, 3, 5, 7]  
// Cannot convert value of type '[Int]' to specified type 'Set'

. Теперь я переключился на «NSSet» (который я нашел случайно), и теперь он, кажется, работает.Почему использование обычного «Set» не работает?Когда я иду к DD NSSet, он говорит: «Объект, представляющий статическую, неупорядоченную, уникальную коллекцию, для использования вместо константы Set в случаях, когда требуется ссылочная семантика».Это о ссылочных типах?DD также утверждает, что массивы являются типами значений.Я в недоумении относительно того, когда использовать Set или NSSet (или даже NSMutableSet для этого способа).

var intSet2 : NSSet = [2, 3, 5, 7]  
// Works

Наконец, когда я пытаюсь преобразовать массив цветов с типом [CardColor] вSet или NSset, я получаю сообщение об ошибке, в котором говорится: «Невозможно преобразовать значение типа« [CardColor] »в указанный тип« NSSet ».

let colorCheck = selectedCards.map { $0.color }  
var colorCheckSet : NSSet = colorCheck  
// Cannot convert value of type '[CardColor]' to specified type 'NSSet'

Заранее спасибо за помощь.

Модель комплекта:

import Foundation

class Set {

    // MARK: properties

    var deck = [Card]()
    var tableCards = [Card]()
    var matchedCards = [Card]()
    var selectedCards: [Card] {
        get {
            var cards = [Card]()
            for card in tableCards.indices {
                if tableCards[card].isSelected == true {
                    cards.append(tableCards[card])
                }
            }
            return cards
            }
    }

    var unmatchedCards = 12

    var score = 0

    // MARK: functions

    // Selects the card. If this is the third card to be selected, proceeds to check for matches
    func selectCard(at index: Int) {
        if tableCards[index].isSelected == false {
            if selectedCards.count < 3 {
                tableCards[index].isSelected = true
                if selectedCards.count == 3 {
                    checkIfCardsMatch()
                }
            }
        }
        else if tableCards[index].isSelected == true {
            tableCards[index].isSelected = false
        }
    }


    func checkIfCardsMatch() {
        let colorCheck = selectedCards.map { $0.color }
        var colorCheckSet : NSSet = colorCheck
        // Cannot convert value of type '[CardColor]' to specified type 'NSSet'

        var intSet2 : Set = [2, 3, 5, 7]
        // Cannot convert value of type '[Int]' to specified type 'Set'

//        for item in colorCheck {
//            colorCheckSet.insert()
//        }
//        let symbolCheck: Set = selectedCards.map() { $0.symbol }
//        let numberCheck: Set = selectedCards.map() { $0.number }
//        let shadingCheck: Set = selectedCards.map() { $0.shading }
        }

    // MARK: functions

    func dealThreeMoreCards() {
        if unmatchedCards <= 21 {
            unmatchedCards += 3
        }
        print(unmatchedCards)
    }

    //MARK: initialization

    init() {
        for cardcolor in CardColor.allCases {
                    for cardsymbol in CardSymbol.allCases {
                                for cardnumber in CardNumber.allCases {
                                            for cardshading in CardShading.allCases {
                                                let card = Card(initcolor: cardcolor, initsymbol: cardsymbol, initnumber: cardnumber, initshading: cardshading)
                                                deck.append(card)
                                    }
                        }
            }
        }
    }
}

Модель карты:

import Foundation

struct Card {

    var identifier: Int = 0
    var isSelected = false

    var color: CardColor
    var symbol: CardSymbol
    var number: CardNumber
    var shading: CardShading

    static var identifierFactory = 0
    init(initcolor: CardColor, initsymbol: CardSymbol, initnumber: CardNumber, initshading: CardShading){
        color = initcolor
        symbol = initsymbol
        number = initnumber
        shading = initshading
        Card.identifierFactory += 1
        self.identifier = Card.identifierFactory
    }

}
enum CardColor: Int, CaseIterable {
    case red = 1
    case green = 2
    case purple = 3
//        static let all = [cardColor.red, cardColor.green, cardColor.purple]
}
enum CardSymbol: Int, CaseIterable {
    case ovals = 1
    case squiggles = 2
    case diamonds = 3
//        static let all = [cardSymbol.ovals, cardSymbol.squiggles, cardSymbol.diamonds]
}
enum CardNumber: Int, CaseIterable {
    case one = 1
    case two = 2
    case three = 3
//        static let all = [cardNumber.one, cardNumber.two, cardNumber.three]
}
enum CardShading: Int, CaseIterable {
    case solid = 1
    case open = 2
    case striped = 3
//        static let all = [cardShading.solid, cardShading.open, cardShading.striped]
}




// Not every Card variable has been included below. Could cause issues later.
extension Card: Hashable {
    static func == (lhs: Card, rhs: Card) -> Bool {
        return lhs.identifier == rhs.identifier &&
        lhs.isSelected == rhs.isSelected &&
        lhs.color == rhs.color &&
        lhs.symbol == rhs.symbol &&
        lhs.number == rhs.number &&
        lhs.shading == rhs.shading
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(identifier)
        hasher.combine(isSelected)
        hasher.combine(color)
        hasher.combine(symbol)
        hasher.combine(number)
        hasher.combine(shading)
    }
}
...