Метод ApplescriptObj C с параметром - PullRequest
0 голосов
/ 02 апреля 2020

Когда я пытаюсь передать параметр из Swift в метод AppleScriptObj C, в консоли появляется сообщение об ошибке:

нераспознанный селектор, отправленный на объект

Я не очень хорошо осведомлен, когда дело доходит до использования моста Swift-AppleScriptObj C, но я использую метод, изложенный здесь .

Я могу получить ApplescriptObj C вернуть аргумент, но функция не работает, если у нее есть параметр. Итак, в приведенных ниже примерах метод / функция getPlaylists () работает, но когда я пытаюсь вызвать playPlaylist, скажем, из AppDelegate, я получаю сообщение об ошибке.

Файл Applescript:

    script iTunesBridge

    property parent : class "NSObject"

    to getPlaylists() -- () -> [NSString]
        tell application "Music"
        set theList to (name of playlists)
        return theList
        end tell
    end getPlaylists

    to playPlaylist:plist -- (NSString) -> ()
        tell application "Music"
            play playlist (plist as string)
        end tell
    end playPlaylist

    end script

Swift file:

import Cocoa

@objc(NSObject) protocol iTunesBridge {

    func getPlaylists() -> [NSString]
    func choosePlaylist(plist: NSString)

}

Я думаю, что именно так я структурировал playPlaylist в файле AppleScript, но я пробовал несколько разных способов, и все приводят к одной и той же ошибке.

1 Ответ

0 голосов
/ 02 апреля 2020

Я нашел решение, но понятия не имею, как оно работает. Если бы кто-нибудь мог просветить меня, я был бы очень признателен!

Я создаю две функции в ApplescriptObj C, одну для получения списка воспроизведения, другую для установки списка воспроизведения. В файле моста я установил переменную { get set }, а затем перечислил функцию для установки списка воспроизведения. В моем контроллере представления (где я делаю изменения) я создаю переменную obj c dynamici c, которая имеет get / set. Затем я могу изменить эту переменную, и она вызовет функцию AppleScript, чтобы изменить мой список воспроизведения ... Код такой:

Файл приложения:

script iTunesBridge

    property parent : class "NSObject"

    to playlist()
        tell application "Music"
           return name of current playlist
        end tell
    end playlist

    to setPlaylist:plist -- (NString) -> ()
        tell application "Music"
           play playlist (plist as string)
           reveal current track
        end tell
    end setPlaylist:

 end script

Файл Bridge Swift:

import Cocoa

@objc(NSObject) protocol iTunesBridge {

    var playlist: NSString { get set }
    func setPlaylist(plist: NSString)

}

ViewController:

class MainController: NSViewController {

    @objc dynamic var currentPlaylist: NSString! {
        get { return self.iTunesBridge.playlist }
        set(value) { self.iTunesBridge.playlist = value }
    }

}

Как я уже сказал, я мало представляю, как и почему это работает, и буду очень признателен за ответ. Например, даже если ни в какой момент в swift я не включаю ie var playlist в функцию setPlaylist, он знает, как их соединить. Набор должен быть волшебный c слово ...

...