Swift:未定义的符号:iTunesApplication

时间:2014-12-10 07:52:07

标签: macos cocoa swift itunes scripting-bridge

我正在尝试创建Swift OS X应用程序,并发现使用ScriptingBridge时遇到了困难。

我包含了正确的iTunes.h文件,当我将“iTunesApplication”作为类型编写时,Xcode没有出现任何错误。

然而,当我编译(运行)该应用程序时,它给了我错误:( 有人知道这个问题吗?

  

架构x86_64的未定义符号:
  “_OBJC_CLASS _ $ _ iTunesApplication”,引自:        AppDelegate.o中的__TFC12LoveYouChloe11AppDelegate10showWindowfS0_FPSs9AnyObject_T_
  ld:找不到架构x86_64的符号
  clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

这是我的代码:

var iTunes: iTunesApplication = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes") as iTunesApplication
iTunes.playpause()

2 个答案:

答案 0 :(得分:0)

解决此问题的最佳方法是使用生成的Objective-C Scripting Bridge标头并将其转换为本机Swift。我写了一个Python脚本(here),可以为你做到这一点。您可以查看我的回答here,以便更好地了解您感兴趣的确切内容。

答案 1 :(得分:-1)

而不是

var iTunes: iTunesApplication = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes") 

使用

var iTunes: AnyObject = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes")

有时,当您连续访问两个或多个属性时,编译器会感到困惑(不明白为什么),因此您可能需要使用临时变量。 E.g:

而不是:

let songName: String = iTunes.playlists[0].songs[0].name

尝试:

let song: AnyObject = iTunes.playlists[0].songs[0]
let songName = song.name

或者更快(如果您将iTunes声明为SBApplication,这也有效):

let songName: String = iTunes.valueAtIndex(0, inPropertyWithKey: "playlists").valueAtIndex(0, inPropertyWithKey: "songs").valueForKey("name")

修改 您还可以生成此处指定的.swift标头:https://github.com/tingraldi/SwiftScripting