第三周第四天
分?jǐn)?shù)類,運(yùn)算符重載,歐幾里得算法
// 短除法(歐幾里得算法)
// x和y的最大公約數(shù)跟y%x和x的最大公約數(shù)是一樣的
// Greatest Common Divisor
func gcd(x: Int, _ y: Int) -> Int {
if x > y {
return gcd(y, x)
}
else if y % x != 0 {
return gcd(y % x, x)
}
else {
return x
}
}
class Fraction {
private var _num: Int
private var _den: Int
var info: String {
get {//分子為0 或者分母為1都返回分子
return _num == 0 || _den == 1 ? "\(_num)" : "\(_num)/\(_den)"
}
}
init(num: Int, den: Int) {
_num = num
_den = den
simplify()
normalize()
}
//返回類型盡量用自己的少用初始的
func add(other: Fraction) -> Fraction {
return Fraction(num: _num * other._den + other._num * _den, den: _den * other._den)
}
func sub(other: Fraction) -> Fraction {
return Fraction(num: _num * other._den - other._num * _den, den: _den * other._den)
}
func mul(other: Fraction) -> Fraction {
return Fraction(num: _num * other._num, den: _den * other._den)
}
func div(other: Fraction) -> Fraction {
return Fraction(num: _num * other._den, den: _den * other._num)
}
func normalize() -> Fraction {
if _den < 0 {
_num = -_num
_den = -_den
}//如果分母為負(fù)數(shù)分子分母同時(shí)取相反數(shù)
return self
}
func simplify() -> Fraction {
if _num == 0 {
_den = 1
}
else {
let x = abs(_num)
let y = abs(_den)
let g = gcd(x, y)
_num /= g
_den /= g
}
return self
}
}
// 運(yùn)算符重載(為自定義的類型定義運(yùn)算符)
func +(one: Fraction, two: Fraction) -> Fraction {
return one.add(two)
}
func -(one: Fraction, two: Fraction) -> Fraction {
return one.sub(two)
}
func *(one: Fraction, two: Fraction) -> Fraction {
return one.mul(two)
}
func /(one: Fraction, two: Fraction) -> Fraction {
return one.div(two)
}
學(xué)生類,文檔注釋,屬性的分類
// 存儲(chǔ)屬性通常是private的 因?yàn)閿?shù)據(jù)要保護(hù)起來
// 方法一般是public的 因?yàn)榉椒ㄊ菍?duì)象接受的消息
// 如果自定義的類沒有打算在其他項(xiàng)目中使用 可以不寫訪問修飾符
// 直接使用默認(rèn)的internal修飾符表示在本項(xiàng)目中公開對(duì)其他項(xiàng)目私有
/// 學(xué)生
public class Student {
private var _name: String
private var _age: Int
/// 學(xué)生姓名隱去最后一個(gè)字符
public var name: String {
get {
let displayName = _name.substringToIndex(_name.endIndex.advancedBy(-1))
return displayName + "*"
}
}
/// 學(xué)生的年齡
public var age: Int {
get { return _age }
}
/**
初始化方法
- parameter name: 姓名
- parameter age: 年齡
*/
public init(name: String, age: Int) {
_name = name
_age = age
}
/**
吃飯
- parameter food: 吃的東西
*/
public func eat(food: String) {
print("\(_name)正在吃飯.")
}
/**
學(xué)習(xí)
- parameter courseName: 課程的名稱
- parameter hour: 學(xué)習(xí)時(shí)間
- returns: 學(xué)會(huì)了返回true否則返回false
*/
public func study(courseName: String, hour: Int) -> Bool {
print("\(_name)正在學(xué)習(xí)\(courseName).")
return hour > 180 ? true : false
}
/**
看片
*/
public func watchJapaneseAV() {
if _age >= 18 {
print("\(_name)正在觀看島國(guó)愛情動(dòng)作片.")
}
}
}
一張牌類
import Foundation
enum Direction: Int {
case Up, Right, Down, Left
}
// GET: 枚舉是定義符號(hào)常量的最佳方式
// GET: 符號(hào)常量總是優(yōu)于字面常量
/**
花色的枚舉
- Spade: 黑桃
- Heart: 紅心
- Club: 草花
- Diamond: 方塊
*/
enum Suite: String {
case Spade = "??"http://特殊字符無(wú)法顯示
case Heart = "??"
case Club = "??"
case Diamond = "??"
}
/// 一張牌
class Card {
var suite: Suite
var face: Int
/**
初始化方法
- parameter suite: 花色
- parameter face: 點(diǎn)數(shù)
*/
init(suite: Suite, face: Int) {
self.suite = suite
self.face = face
}
/// 牌的信息
var info: String {
get {
var str = suite.rawValue
switch face {
case 1: str += "A"
case 11: str += "J"
case 12: str += "Q"
case 13: str += "K"
default: str += "\(face)"
}
return str
}
}
}
一副牌類
import Foundation
func randomInt(min: UInt32, _ max: UInt32) -> Int {
return Int(arc4random_uniform(max - min + 1) + min)
}
/// 一副牌
class Poker {
var cardsArray: [Card] = []
init() {
reset()
}
/**
重置所有的牌
*/
func reset() {
// 移除數(shù)組中剩下的牌
cardsArray.removeAll()
// 將52張牌按照黑紅梅方的順序放到數(shù)組中
let suitesArray = [Suite.Spade, .Heart, .Club, .Diamond]
for suite in suitesArray {
for face in 1...13 {
let card = Card(suite: suite, face: face)
cardsArray.append(card)
}
}
}
/**
洗牌
*/
func shuffle() {
// 洗牌之前先重置所有的牌
reset()
// 通過隨機(jī)亂序的方式打亂牌的位置
for i in 0..<cardsArray.count {
let j = randomInt(0, UInt32(cardsArray.count - 1))
(cardsArray[i], cardsArray[j]) = (cardsArray[j], cardsArray[i])
}
}
/**
發(fā)牌
- returns: 當(dāng)前剩下牌中的第一張牌或nil
*/
func deal() -> Card? {
if hasMoreCards {
return cardsArray.removeFirst()
}
return nil
}
/// 還有沒有更多的牌
var hasMoreCards: Bool {
get { return cardsArray.count > 0 }
}
}
玩家類
import Foundation
func <(one: Card, two: Card) -> Bool {
return one.face < two.face
}
class Player {
var nickname: String
var cardsOnHand: [Card] = []
init(nickname: String) {
self.nickname = nickname
}
func getOneCard(card: Card) {
cardsOnHand.append(card)
}
func sortCards() {
cardsOnHand.sortInPlace(<)
}
}
調(diào)用這些類,和這些類的展示
import Foundation
func showPlayerCards(player: Player) {
print("\(player.nickname)", terminator: ": ")
player.sortCards()
for card in player.cardsOnHand {
print(card.info, terminator: " ")
}
print("")
}
// 撲克游戲
let p = Poker()
p.shuffle()
let playersArray = [
Player(nickname: "張尼瑪"),
Player(nickname: "王尼瑪"),
Player(nickname: "李尼瑪"),
Player(nickname: "劉尼瑪")
]
for _ in 1...3 {
for player in playersArray {
if p.hasMoreCards {
player.getOneCard(p.deal()!)
}
}
}
for player in playersArray {
showPlayerCards(player)
}