首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Swift中调用getter方法时崩溃

在Swift中调用getter方法时崩溃
EN

Stack Overflow用户
提问于 2015-06-16 00:59:14
回答 3查看 772关注 0票数 0

我正在iTunes U上上斯坦福大学的iOS课程,在调用getter方法时出现了奇怪的行为

代码语言:javascript
运行
复制
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方法中的返回语句。如果我忽略get方法并调用

代码语言:javascript
运行
复制
operandStack.append(NSNumberFormatter().numberFromString(display.text!)!.doubleValue)

一切正常,但我不明白为什么get方法会崩溃,它不是做了与上面的代码完全相同的事情吗?

这是完整的回溯

代码语言:javascript
运行
复制
* 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
EN

回答 3

Stack Overflow用户

发布于 2015-06-16 01:06:03

代码语言:javascript
运行
复制
var newNumber = true

这是一个布尔值。

代码语言:javascript
运行
复制
display.text = "\(newNumber)"

您正在将标注的文本设置为该布尔值

代码语言:javascript
运行
复制
NSNumberFormatter().numberFromString(display.text

在这里,您是从布尔值创建数字,而不是从NSNumber。

你的意思可能是"newValue“。

票数 0
EN

Stack Overflow用户

发布于 2015-06-16 02:37:01

以下是修改后的工作代码:

你得到崩溃的那条线已经被替换了。

代码语言:javascript
运行
复制
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)")
    }

}
票数 0
EN

Stack Overflow用户

发布于 2015-06-19 17:51:57

事实证明我只是意外地放置了一个断点,而不知道它是什么。去掉它当然就解决了问题

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30850835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档