xcode – Swift和scriptingbridge对象初始化
我正在尝试编写一个快速控制iTunes的应用程序.但是在初始化应用程序时会返回AnyObject类型的对象,但必须是iTunesApplication.
此对象不响应iTunes的方法和变量.谁知道如何使它工作? var iTunes = SBApplication.applicationWithBundleIdentifier("com.apple.iTunes") iTunes.h标题还包含我需要访问但不能访问的类. 为什么这件事发生在我身上尚不清楚. 通过@class声明为iTunes.h的类的完整列表: @class iTunesPrintSettings,iTunesApplication,iTunesItem,iTunesAirPlayDevice,iTunesArtwork,iTunesEncoder,iTunesEQPreset,iTunesPlaylist,iTunesAudioCDPlaylist,iTunesLibraryPlaylist,iTunesRadioTunerPlaylist,iTunesSource,iTunesTrack,iTunesAudioCDTrack,iTunesFileTrack,iTunesSharedTrack,iTunesURLTrack,iTunesUserPlaylist,iTunesFolderPlaylist,iTunesVisual,iTunesWindow,iTunesBrowserWindow,iTunesEQWindow,iTunesPlaylistWindow; 例如,在Objective -c中,您可以使用类似的东西来获取当前曲目 iTunesApplication *iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; NSLog(@"Current song is %@",[[iTunes currentTrack] name]); 但我无法迅速获得相同的工作. 解决方法
在我的快速项目中,我遇到了使用生成的iTunes.h文件中定义的类型(链接错误等)的问题.
markhunte的答案解释说,您可以获得对应用程序对象的引用.但除此之外,我在尝试从该应用程序对象获取实例时遇到了编译/链接器错误. 在我的快速项目中,我最终创建了一个客观的C包装类,它将iTunes类型公开为基本目标C类型(数组和字典),并且也适应方法. 我的swift类使用这个包装器而不是iTunes类型. 所以,目标C包装器看起来像这样(redux): #import "ITunesBridgex.h" #import "iTunes.h" @interface ITunesBridgex(){ iTunesApplication *_iTunesApplication; iTunesSource* _iTunesLibrary; } @end @implementation ITunesBridgex -(id)init { self = [super init]; if (self) { _iTunesApplication = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; NSArray *sources = [_iTunesApplication sources]; for (iTunesSource *source in sources) { if ([source kind] == iTunesESrcLibrary) { _iTunesLibrary = source; break; } } } return self; } - (NSDictionary*) currentTrack { iTunesTrack* track = _iTunesApplication.currentTrack; if (!track) return nil; NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: track.name,@"title",nil]; return dict; } @end 和调用swift代码: import Foundation import Cocoa class ITunesBridgeSimple { var iTunesBridgex: ITunesBridgex init(){ iTunesBridgex = ITunesBridgex() self.updateFromCurrentTrack() } func updateFromCurrentTrack() { if let track = self.currentTrack { if let title : AnyObject = track.objectForKey("title"){ println("Current track: (title)") } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |