Skip to content

Commit 2a8367c

Browse files
Adding source.
1 parent 6fb57cd commit 2a8367c

File tree

12 files changed

+197
-0
lines changed

12 files changed

+197
-0
lines changed

.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>SchemeUserState</key>
6+
<dict>
7+
<key>PlayingCards.xcscheme_^#shared#^_</key>
8+
<dict>
9+
<key>orderHint</key>
10+
<integer>1</integer>
11+
</dict>
12+
<key>playing-cards.xcscheme_^#shared#^_</key>
13+
<dict>
14+
<key>orderHint</key>
15+
<integer>0</integer>
16+
</dict>
17+
</dict>
18+
</dict>
19+
</plist>

Package.swift

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// swift-tools-version:5.5
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "playing-cards",
7+
platforms: [.iOS(.v13), .macOS(.v10_15), .tvOS(.v13), .watchOS(.v6)],
8+
products: [
9+
.library(
10+
name: "PlayingCards",
11+
targets: ["PlayingCards"]),
12+
],
13+
dependencies: [
14+
],
15+
targets: [
16+
.target(
17+
name: "PlayingCards",
18+
dependencies: []),
19+
.testTarget(
20+
name: "PlayingCardsTests",
21+
dependencies: ["PlayingCards"]),
22+
]
23+
)

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# PlayingCards
2+
3+
![iOS](https://img.shields.io/badge/iOS-13%2B-blue)
4+
![macOS](https://img.shields.io/badge/macOS-10.15%2B-blue)
5+
![tvOS](https://img.shields.io/badge/tvOS-13%2B-blue)
6+
![watchOS](https://img.shields.io/badge/watchOS-6%2B-blue)
7+
8+
A standard 52 deck of [French-suited playing cards](https://en.wikipedia.org/wiki/French-suited_playing_cards).
9+
10+
## Usage
11+
12+
The `Deck` instance has an array of cards. Upon instantiation, 52 cards are populated, in random order.
13+
14+
```swift
15+
struct Dealer {
16+
17+
private var deck = Deck()
18+
19+
mutating func pullCard() -> PlayingCard? {
20+
if let card = deck.pullCard() {
21+
return card
22+
}
23+
self.deck = Deck()
24+
return pullCard()
25+
}
26+
}
27+
```

Sources/PlayingCards/Deck.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import Foundation
2+
3+
public struct Deck {
4+
5+
public
6+
var cards: [PlayingCard] = []
7+
8+
public
9+
init() {
10+
var collection: [PlayingCard] = []
11+
for rank in Rank.allCases {
12+
collection.append(PlayingCard(rank: rank, suit: .diamonds))
13+
collection.append(PlayingCard(rank: rank, suit: .hearts))
14+
collection.append(PlayingCard(rank: rank, suit: .clubs))
15+
collection.append(PlayingCard(rank: rank, suit: .spades))
16+
}
17+
collection.shuffle()
18+
cards = collection
19+
}
20+
21+
/// Extracts a single card from the deck.
22+
/// - Returns: The extracted card or nil if the deck is empty.
23+
public
24+
mutating func pullCard() -> PlayingCard? {
25+
guard cards.isEmpty == false else {
26+
return nil
27+
}
28+
return cards.removeLast()
29+
}
30+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Foundation
2+
3+
public struct PlayingCard: Hashable, Identifiable {
4+
5+
public var id: Self { self }
6+
7+
public let rank: Rank
8+
public let suit: Suit
9+
10+
public init(rank: Rank, suit: Suit) {
11+
self.rank = rank
12+
self.suit = suit
13+
}
14+
}

Sources/PlayingCards/Rank.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import Foundation
2+
3+
public enum Rank: String, CaseIterable {
4+
case ace
5+
case two, three, four, five, six, seven, eight, nine, ten
6+
case jack, queen, king
7+
}

Sources/PlayingCards/Suit.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import Foundation
2+
3+
public enum Suit: String, CaseIterable {
4+
case spades, hearts, diamonds, clubs
5+
}

Tests/PlayingCardsTests/Deck.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import XCTest
2+
@testable import PlayingCards
3+
4+
final class DeckTests: XCTestCase {
5+
6+
private var deck = Deck()
7+
8+
func testCount() {
9+
XCTAssertTrue(deck.cards.count == 52)
10+
}
11+
12+
func testPullCard() {
13+
XCTAssertNotNil(deck.pullCard())
14+
deck.cards.removeAll()
15+
XCTAssertNil(deck.pullCard())
16+
}
17+
}

0 commit comments

Comments
 (0)