URL'yi bir NSSound
nesnesinden almak için genel bir arabirim görmedim, bu yüzden ne bulabildiğimi görmek için private headers'u incelemeye başladım. Özel bir yöntem url
ve _url
olduğu için, NSSound
URL'sini döndürür. Muhtemelen bunlar bir NSURL
ivar veya mülk için alıcılardır.
Objective-C ile bu kolay olurdu: yöntemleri yeni bir arabirime veya uzantıya eklerdik. Saf Swift işler biraz yanıltıcıdır vardır ve biz bir Objective-C protokolü aracılığıyla erişimci maruz gerekir olarak: url
yana
@objc protocol NSSoundPrivate {
var url: NSURL? { get }
}
bir örnek yöntemidir, sen func url() -> NSURL?
yerine bir değişken kullanarak daha iyi sonuçlar elde edilebilir. Milajınız değişiklik gösterebilir: bir salt okunur özellik davranışını benim için işe yarayacak gibi görünmek için bir var
kullanarak.
Ben
AVAudioPlayer
üzerinde bir uzantısı yeni bir kolaylık başlatıcı yazdı:
extension AVAudioPlayer {
convenience init?(sound: NSSound) throws {
let privateSound = unsafeBitCast(sound, NSSoundPrivate.self)
guard let url = privateSound.url else { return nil }
do {
try self.init(contentsOfURL: url)
} catch {
throw error
}
}
}
Kullanımı:
let url = NSURL(...)
if let sound = NSSound(contentsOfURL: url, byReference: true) {
do {
let player = try AVAudioPlayer(sound: sound)
player?.play()
} catch {
print(error)
}
}
Ivars içinde NSData
ile ilgili her şeyi, örneğin yöntemleri ve özelliklerini bulmak denemeden sonra Bir NSSound, bir NSSound
'u başlatmak için kullandığınız her şeyin veri kısmının, sınıfın uygulanmasında bir yere gizlendiğini ve şu şekilde mevcut olmadığı sonucuna vardım. URL
Ses dosyası yoksa, bu satır çökmez mi? 'aSound.sound = NSSound (contentOfURL: aSound.path)!' – brimstone
Evet, ama bu durumda '.sound' asla boş değil. – Matt
Dürüst olmak gerekirse, bir NSSound'dan ses verisi alabileceğinizi düşünmüyorum. – brimstone