2015-06-15 46 views
-1

我正在做的事情的iTunes U斯坦福iOS的过程getter方法时,以及调用一个getter方法崩溃调用雨燕

import UIKit 

class ViewController: UIViewController { 
    @IBOutlet weak var display: UILabel! 
    var newNumber = true 
    var operandStack = Array<Double>() 
    var displayValue: Double{ 
     get{ 
      return NSNumberFormatter().numberFromString(display.text!)!.doubleValue 
     } 
     set{ 
      display.text = "\(newNumber)" 
      newNumber = true 
     } 
    } 

    @IBAction func appendDigit(sender: UIButton) { 
     let digit = sender.currentTitle! 
     if(newNumber){ 
      display.text = digit 
      newNumber = false 
     }else{ 
      display.text = display.text! + digit 
     } 
    } 

    @IBAction func enter() { 
     if(!newNumber){ 
      newNumber = true 
     } 
     operandStack.append(displayValue) 
     println("\(operandStack)") 
    } 

} 

enter()方法被调用我得到一个崩溃时,我得到的奇怪行为断点指向displayValue get方法中的return语句。如果我忽略get方法和调用

operandStack.append(NSNumberFormatter().numberFromString(display.text!)!.doubleValue) 

一切工作正常,但我不明白为什么get方法崩溃,是不是做同样的事情上面的代码会?

这是一个完整回溯

* thread #1: tid = 0x133463, 0x000e4738 Kalkylator`Kalkylator.ViewController.displayValue.getter : Swift.Double(self=0x7986d560) + 24 at ViewController.swift:17, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 
    * frame #0: 0x000e4738 Kalkylator`Kalkylator.ViewController.displayValue.getter : Swift.Double(self=0x7986d560) + 24 at ViewController.swift:17 
    frame #1: 0x000e57c2 Kalkylator`Kalkylator.ViewController.enter (self=0x7986d560)() ->() + 130 at ViewController.swift:39 
    frame #2: 0x000e5992 Kalkylator`@objc Kalkylator.ViewController.enter (Kalkylator.ViewController)() ->() + 34 at ViewController.swift:0 
    frame #3: 0x01d0c7cd libobjc.A.dylib`-[NSObject performSelector:withObject:withObject:] + 84 
    frame #4: 0x00b1aa90 UIKit`-[UIApplication sendAction:to:from:forEvent:] + 99 
    frame #5: 0x00b1aa22 UIKit`-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 64 
    frame #6: 0x00c5b18a UIKit`-[UIControl sendAction:to:forEvent:] + 69 
    frame #7: 0x00c5b5a7 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 598 
    frame #8: 0x00c5a811 UIKit`-[UIControl touchesEnded:withEvent:] + 660 
    frame #9: 0x00b72cfa UIKit`-[UIWindow _sendTouchesForEvent:] + 874 
    frame #10: 0x00b737d6 UIKit`-[UIWindow sendEvent:] + 792 
    frame #11: 0x00b316d1 UIKit`-[UIApplication sendEvent:] + 242 
    frame #12: 0x00b41b08 UIKit`_UIApplicationHandleEventFromQueueEvent + 21484 
    frame #13: 0x00b15337 UIKit`_UIApplicationHandleEventQueue + 2300 
    frame #14: 0x0021706f CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
    frame #15: 0x0020cb7d CoreFoundation`__CFRunLoopDoSources0 + 253 
    frame #16: 0x0020c0d8 CoreFoundation`__CFRunLoopRun + 952 
    frame #17: 0x0020ba5b CoreFoundation`CFRunLoopRunSpecific + 443 
    frame #18: 0x0020b88b CoreFoundation`CFRunLoopRunInMode + 123 
    frame #19: 0x03fa32c9 GraphicsServices`GSEventRunModal + 192 
    frame #20: 0x03fa3106 GraphicsServices`GSEventRun + 104 
    frame #21: 0x00b19106 UIKit`UIApplicationMain + 1526 
    frame #22: 0x000eec64 Kalkylator`main + 180 at AppDelegate.swift:12 
    frame #23: 0x02407ac9 libdyld.dylib`start + 1 
+0

请发布完整的回溯。 – JAL

+0

在调用'operandStack.append(displayValue)'之前,display.text和displayValue的内容是什么? 这真的是一个崩溃或只是在一个断点停止? – MirekE

+0

向帖子添加了回溯 –

回答

0
var newNumber = true 

这是一个布尔值。

display.text = "\(newNumber)" 

你的标签的文本设置为那布尔

​​

您正在从一个布尔一批价值 - 而不是一个NSNumber - 在这里。

您可能是指“newValue”。

+0

哦,这是一个错误,它应该是newValue。虽然我从来没有真正打电话给二传手,并修复这条线似乎并没有解决崩溃 –

0

这里是修改后的工作代码:

上,你越来越崩溃的线已经被更换。

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var display: UILabel! 

    var newNumber = true 
    var operandStack = Array<Double>() 
    var displayValue: Double { 
     get{ 
      return (display.text! as NSString).doubleValue // Changed Line 
     } 
     set{ 
      display.text = "\(newNumber)" 
      newNumber = true 
     } 
    } 

    @IBAction func appendDigit(sender: UIButton) { 
     let digit = sender.currentTitle! 
     if(newNumber){ 
      display.text = digit 
      newNumber = false 
     }else{ 
      display.text = display.text! + digit 
     } 
    } 

    @IBAction func enter() { 
     if(!newNumber){ 
      newNumber = true 
     } 
     operandStack.append(displayValue) 
     println("\(operandStack)") 
    } 

} 
-1

原来我只是意外地放置了一个断点而不知道它是什么。删除它当然解决了问题