##8.1數字格式設置(storyboard)
##8.1.2可選類型拆封ide
import Cocoa extension Double{ var dollars : String{ let formatter : NumberFormatter = NumberFormatter()//NSNumberFormatter棄用 var result : String?//將result的類型聲明爲可選類型 formatter.numberStyle = .currency result = formatter.string(from: NSNumber(value:self)) // .string(from: NSNumber)返回爲可選類型,由於若是轉換失敗會返回nil if (result == nil){ return "FORMAT FAILURE!" } return result!//拆封可選變量,拆封指的是將變量轉換爲值不能爲nil的變量 } } class ViewController: NSViewController { //"!"爲隱式封拆的可選類型,至關於告訴編譯器,在該變量爲nil時毫不會訪問它 @IBOutlet weak var loanAmountField :NSTextField! @IBOutlet weak var interestRateField : NSTextField! @IBOutlet weak var yearsField : NSTextField! @IBOutlet weak var resultsField : NSTextField! var simpleInterestCalculator : SimpInterest = SimpInterest() var compoundInterestCalculator : CompoundInterest = CompoundInterest() override func viewDidLoad() { super.viewDidLoad() } override var representedObject: Any? { didSet { } } [@IBAction](https://my.oschina.net/u/866341) func buttonClicked(sender : NSButton){ var result : Double result = simpleInterestCalculator.calculate(loanAmount: loanAmountField.doubleValue, interestRate: interestRateField.doubleValue , years: yearsField.integerValue) // self.resultsField.stringValue = result.description//description讓類可以返回其數據的String表示 self.resultsField.stringValue = result.dollars } @IBAction func compoundbuttonClicked(_ sender: NSButton) { var result : Double result = compoundInterestCalculator.calculate(loanAmount: loanAmountField.doubleValue, interestRate: interestRateField.doubleValue , years: yearsField.integerValue) // self.resultsField.stringValue = result.description//description讓類可以返回其數據的String表示 self.resultsField.stringValue = result.dollars } }
8.2單元測試 if Use of undeclared type 'SimpInterest' take class Target Membership choose單元測試
import XCTest class MACSwiftTeststwo: XCTestCase { var mySimpInterestCalculator : SimpInterest = SimpInterest() var myCompoundInterestCalculator : CompoundInterest = CompoundInterest() override func setUp() { super.setUp() // Put setup code here. This method is called before the invocation of each test method in the class. //在這裏插入設置代碼,調用這個類中的每一個測試方法前,都將調用這個方法 } override func tearDown() { // Put teardown code here. This method is called after the invocation of each test method in the class. //在這裏插入清理代碼,調用這個類中的每一個測試方法後,都將調用這個方法 super.tearDown() } //功能測試用例 func testSimpleInterest(){ var result : Double result = mySimpInterestCalculator.calculate(loanAmount: 25_000, interestRate: 0.08, years: 10) XCTAssertEqualWithAccuracy(result,45000,accuracy:0.1 ,"Unexpected result \(result)")//1.要評估的變量 2.該變量應包含的值 3準確因子 4.未經過測試時顯示的String //傳入的變量和預期結果相差不超過0.1 } func testCompoundInterest(){ var result : Double result = myCompoundInterestCalculator.calculate(loanAmount: 25_000, interestRate: 0.08, years: 10) XCTAssertEqualWithAccuracy(result, 25002+0.1, accuracy: 0.1,"Unexpected result \(result)") } //示例測試方法 // func testExample() { // // This is an example of a functional test case. // // Use XCTAssert and related functions to verify your tests produce the correct results. // } // // func testPerformanceExample() { // // This is an example of a performance test case. // self.measure { // // Put the code you want to measure the time of here. // } // } }