2016-12-11 56 views
2

我試圖創建一個類來學習單元測試。但是,我正面臨着一些我正在努力的問題。Swift錯誤輸出的簡單類的初始化程序

我的班級:

import Foundation 

class Monster{ 

var name: String{ 
    didSet(newName){ 
     self.name = validateName(newName: self.name) 
    } 
} 

var level: Int{ 
    didSet(level){ 
     if self.level < 0 { 
      self.level = 0 
     }else if self.level > 100 { 
      self.level = 100 
     } 
    } 
} 

var hitpoints: Int{ 
    didSet(newHP){ 
     print(self.hitpoints) 
     if self.hitpoints < 0 { 
      self.hitpoints = 0 
     }else if self.hitpoints > self.level * 20{ 
      self.hitpoints = self.level * 20 
     } 
    } 
} 

init(name: String, argLevel: Int, argHP: Int) { 
    self.name = name; 
    self.level = argLevel 
//  self.hitpoints = validateHP(newHP: argHP, curLevel: argLevel) 
    let newHP = validateHP(newHP: argHP, curLevel: argLevel) 
    self.hitpoints = newHP 
    self.name = validateName(newName: name) 
} 

private func validateName(newName: String) -> String{ 
    return newName.replacingOccurrences(of: ",", with: "") 
} 

private func validateHP(newHP: Int, curLevel: Int) -> Int{ 
    if newHP < 0 { 
     return 0 
    }else if newHP > 20 * curLevel { 
     return 20 * curLevel 
    }else{ 
     return newHP 
    } 
} 

} 

我不能使用這個類,因爲我得到一個錯誤,在初始化使用validateHP()函數。

錯誤:桌面/單元測試/單元測試/ Monster.swift:44:15:所有存儲的屬性初始化

在方法調用validateHP'自我'的使用之前,我不明白這條消息,我沒有在函數定義中使用任何存儲的屬性或作爲參數之一。事實上,我改變了整個參數結構,這樣就不會發生。

如果任何人都可以教我關於我在這裏失蹤的事情,那將非常有幫助。

回答

2

在實例初始化之前,您無法調用實例方法。請嘗試將validateHPvalidateNamestatic功能:

init(name: String, argLevel: Int, argHP: Int) { 
    self.name = name; 
    self.level = argLevel 
    //  self.hitpoints = validateHP(newHP: argHP, curLevel: argLevel) 
    let newHP = Monster.validateHP(newHP: argHP, curLevel: argLevel) 
    self.hitpoints = newHP 
    self.name = Monster.validateName(newName: name) 
} 

private static func validateName(newName: String) -> String { 
    return newName.replacingOccurrences(of: ",", with: "") 
} 

private static func validateHP(newHP: Int, curLevel: Int) -> Int { 
    if newHP < 0 { 
     return 0 
    } else if newHP > 20 * curLevel { 
     return 20 * curLevel 
    } else { 
     return newHP 
    } 
} 

注:斯威夫特喜歡周圍的令牌空間。我建議在{}之前和之後使用空格將它們與其他元素分開。

+0

同樣需要用'validateName'函數完成。 – rmaddy

+0

你是對的@rmaddy。我會更新答案。 – vacawama

+0

由於某種原因,驗證名稱正常工作,沒有靜態,看起來很奇怪。無論如何,我用你的代碼更新了它,它正在工作。謝謝。 – Quicksillver