beyondtdr
beyondtdr

Reputation: 451

Set does not work despite copying from Developer Documentation

Whilst attempting to create a set, I get the error stating "Cannot convert value of type '[Int]' to specified type 'Set'". This occurs even though I write the code exactly as in the 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'

I have now switched to 'NSSet' (which I found by accidence) and now it appears to work. How come using normal 'Set' does not work? When I go to the DD of NSSet it says: "An object representing a static, unordered, uniquing collection, for use instead of a Set constant in cases that require reference semantics." Is this about reference types? The DD also states that arrays are value types. I'm at a loss as to when to use Set or NSSet (or even NSMutableSet for that manner).

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

Lastly, when I try to convert an array of colors with type [CardColor] to a Set or NSset, I receive error message stating: "Cannot convert value of type '[CardColor]' to specified type 'NSSet'.

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

Thanks for your help in advance.

Set model:

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)
                                    }
                        }
            }
        }
    }
}

Card model:

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)
    }
}

Upvotes: 1

Views: 48

Answers (0)

Related Questions