【问题标题】:How would this be converted from Obj-C to Swift?这将如何从 Obj-C 转换为 Swift?
【发布时间】:2015-07-01 15:44:57
【问题描述】:

我正在尝试用 swift 重写一个当前在 Objective-C 中的应用程序。我如何将这一行更改为 Swift,因为我目前的尝试并不正确

Tabata *tabata = [notification object];

这是整个函数:

- (void)stateChanged:(NSNotification*)notification
{
if (enabled)
{
    Tabata *tabata = [notification object];
    switch (tabata.getState) {
        case EXERCISE:
        case RELAXATION:
            [player play];
            break;

        default:
            break;
    }
}
}

这是我转换成 Swift 的内容:

func stateChanged(notifcation: NSNotification) {
    if enabled {

        var tabata: Tabata! = notification.object //error "Use of unresolved identifier 'notification'"
        switch tabata.getState() {
        case .EXERCISE: fallthrough
        case .RELAXATION:
            player.play()
            break

        default:
            break

        }
    }
}

【问题讨论】:

  • 您有一个错字:您的方法签名将参数列为notifcation,而方法主体尝试使用notification。除此之外,一切看起来都很好。
  • 感谢您指出这一点,尽管现在它给了我错误“'AnyObject?'不能转换为 'Tabata!'"
  • 没关系,我是通过添加'as!田畑!'
  • 我想提醒一句,如果您将代码库转换为 swift,那么如果某些内容可能为零,只需将其视为可选(使用 ? 语法) 与上面代码中的隐式解包可选 (!) 相对。如果 nil 突然出现在无法处理的地方,这只会为您的应用程序在运行时崩溃提供机会。如果您将其视为可选项,那么编译器将帮助您确保 nil 永远不会出现在不应该出现的位置。

标签: objective-c swift ios8 xcode6


【解决方案1】:

在 Swift 中,你必须向下转换 AnyObject 类型的对象,而不是声明类型

   var tabata = notification.object as! Tabata

【讨论】:

    【解决方案2】:
    func stateChanged(notification: NSNotification) {
        if(enabled) {
            var tabata: Tabata = notification.object as! Tabata
            switch tabata.getState() {
            case .EXERCISE:
                fallthrough
            case .RELAXATION:
                player.play()
                break
            default:
                break
            }
        }
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多