Swift avspeechsynthesizer разные языки

utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-au"];

Именно в этой строке кода вы можете изменить языки в obj-c. Но мне было интересно, может ли кто-нибудь сказать мне, как это реализовано в Swift. в документации эта строка кода используется...

init!(language language: String!) -> AVSpeechSynthesisVoice

Но я не могу понять, где бы я это реализовал :/


person Tom Atterton    schedule 28.10.2014    source источник
comment
Значит, проблема не в AVSpeechSynthesisVoice, верно? Проблема в том, что вы не знаете Swift, поэтому не понимаете, как вызвать инициализатор? То есть, на самом деле вы просите: пожалуйста, переведите для меня эту строку кода с Objective-C на Swift? Собираетесь ли вы делать это для каждой строки кода Objective-C в мире, или вы собираетесь научиться делать это для себя? Вот документы: developer.apple.com/library/ios/documentation/Swift/Conceptual/   -  person matt    schedule 28.10.2014


Ответы (1)


Там, где вы видите init(paramName: ParamType) в интерфейсе Swift для типа с именем Type, вы вызываете его с синтаксисом Type(paramName: paramValue). Это прямо в начале главы на Инициализация на Язык программирования Swift, который я рекомендую прочитать, прежде чем углубляться в разработку Cocoa с помощью Swift.

Также стоит прочитать раздел Инициализация в разделе Использование Swift с Cocoa и Objective-C, в котором повторяется вышеизложенное, а также дается общее правило того, как инициализаторы ObjC и фабричные методы автоматически сопоставляться с инициализаторами Swift: если у вас есть класс ObjC с именем Foo с инициализатором initWithBar: и/или методом фабричного класса fooWithBar:, он сопоставляется с инициализатором Swift init(bar:), и вы вызываете его с синтаксисом Foo(bar: someBarValue).

So:

utterance.voice = AVSpeechSynthesisVoice(language: "en-au") // g'day, mate

Обратите внимание, что этот конкретный инициализатор имеет форму init! — это означает, что базовый код ObjC может возвращать nil, и что Swift упаковывает результат вызова инициализатора в Неявно развернутый вариант. Поскольку AVSpeechUtterance.voice может принимать необязательное значение (в том числе с нулевым значением), вы в безопасности. Но если это когда-либо изменится, или если вам нужно иметь дело с API, которые явно требуют ненулевого голоса, вы должны отметить этот необязательный параметр; например.:

if let voice = AVSpeechSynthesisVoice(language: "en-au") {
    // do something with voice
} else {
    // pick another one, maybe?
}
person rickster    schedule 28.10.2014
comment
Я думаю, что для изменения языка разговора с помощью en вместо en-au достаточно. - person Hope; 24.12.2016