Published on

Xcode loyihasiga ovoz effektlari qo'shish

Authors

Ushbu videoda ilovamizga ovoz effekti (sound effect) qo'shamiz. Mantiq texnik jihatdan SwiftUI emas, balki Swift bilan bog'liq β€” ammo ilova yaratayotgan har bir dasturchi ovoz effektlarini qo'shishni bilishi kerak.


Ekran tuzilmasi

struct SoundsBootcamp: View {
    var body: some View {
        VStack(spacing: 40) {
            Button("Play Sound 1") {
                SoundManager.instance.playSound(sound: .tada)
            }

            Button("Play Sound 2") {
                SoundManager.instance.playSound(sound: .badum)
            }
        }
    }
}

SoundManager va Singleton pattern

Ko'pchilik hollarda klass yaratsak, uni @StateObject bilan view'ga bog'laymiz. Ammo SoundManagerda view'ni yangilaydigan hech narsa yo'q (hech qanday @Published o'zgaruvchi kerak emas), shuning uchun ObservableObjectga moslashtirishimiz shart emas.

Bundan tashqari, har bir ekran uchun yangi SoundManager yaratish ham samarasiz β€” ovoz menejeri butun ilova bo'ylab bir xil. Buning uchun Singleton (yakka nusxa) pattern ishlatamiz: klass bir marta yaratiladi va barcha joylarda shu bitta nusxa ishlatiladi.

class SoundManager {
    static let instance = SoundManager()
    // ...
}

static let instance = SoundManager() β€” bu bitta nusxani yaratadi. Boshqa joylarda SoundManager() emas, SoundManager.instance orqali murojaat qilinadi.


AVKit import qilish

import AVKit

AVKit β€” Apple tomonidan taqdim etilgan audio va video vositalar to'plami (A = Audio, V = Video). Unga Xcode'da alohida o'rnatish kerak emas β€” standart holda mavjud.


Enum bilan ovoz variantlarini boshqarish

Har bir ovoz uchun alohida funksiya yaratish o'rniga, enum ishlatamiz. Enumni Stringga moslashtirish orqali, har bir case'ning .rawValuesi β€” uning nomi (masalan, "tada") bo'ladi, va bu fayl nomiga to'g'ridan-to'g'ri mos keladi:

enum SoundOption: String {
    case tada
    case badum
}

playSound funksiyasi

import AVKit

class SoundManager {
    static let instance = SoundManager()

    var player: AVAudioPlayer?

    func playSound(sound: SoundOption) {
        guard let url = Bundle.main.url(
            forResource: sound.rawValue,
            withExtension: "mp3"
        ) else { return }

        do {
            player = try AVAudioPlayer(contentsOf: url)
            player?.play()
        } catch let error {
            print("Error playing sound: \(error.localizedDescription)")
        }
    }
}

Qadamlar:

  1. Bundle.main.url(forResource:withExtension:) β€” fayl nomiga asoslanib URL topadi. sound.rawValue β€” enum case'ining string versiyasi (masalan, "tada").
  2. guard let β€” agar URL topilmasa, funksiyadan chiqib ketamiz.
  3. do/try/catch β€” AVAudioPlayer xato tashlashi mumkin, shuning uchun try va catch ishlatiladi.
  4. player?.play() β€” ovozni ijro etadi.

Audio fayllarni loyihaga qo'shish

  1. freesoundslibrary.com yoki boshqa bepul manbaadan .mp3 fayllarni yuklab olasiz.
  2. Fayl nomlarini enum case'iga mos qilib o'zgartiring: tada.mp3, badum.mp3.
  3. Xcode Navigator'da o'ng tugma β†’ New Group β†’ Sounds deb nomlaymiz.
  4. Fayllarni shu guruhga drag & drop qilamiz.
  5. Ko'rinadigan dialog oynasida:
    • βœ… Copy items if needed β€” fayllarni loyiha ichiga nusxalaydi
    • βœ… Create groups
    • βœ… Add to target β€” faylni ilovaga kiritadi (bu belgilanmasa, ijro qilinmaydi)
  6. "Finish" bosamiz.

Xcode'da fayl ustiga bossangiz, pastdagi "Play" tugmasi bilan ovozni tekshirishingiz mumkin.


Yig'ma kod

// SoundManager.swift
import AVKit

enum SoundOption: String {
    case tada
    case badum
}

class SoundManager {
    static let instance = SoundManager()

    var player: AVAudioPlayer?

    func playSound(sound: SoundOption) {
        guard let url = Bundle.main.url(
            forResource: sound.rawValue,
            withExtension: "mp3"
        ) else { return }

        do {
            player = try AVAudioPlayer(contentsOf: url)
            player?.play()
        } catch let error {
            print("Error playing sound: \(error.localizedDescription)")
        }
    }
}
// SoundsBootcamp.swift
struct SoundsBootcamp: View {
    var body: some View {
        VStack(spacing: 40) {
            Button("Play Sound 1") {
                SoundManager.instance.playSound(sound: .tada)
            }

            Button("Play Sound 2") {
                SoundManager.instance.playSound(sound: .badum)
            }
        }
    }
}

Simulyatorda "Play Sound 1" tugmasini bossak β€” ta-da ovozi yangraydi, "Play Sound 2" β€” badum ovozi.


Xulosa

Ushbu videoda qilganlarimiz:

  • SoundManager klassini Singleton pattern bilan yaratdik β€” butun ilova bo'ylab bitta nusxa ishlaydi, SoundManager.instance orqali murojaat qilinadi.
  • AVKit yordamida AVAudioPlayer bilan ovozni ijro etdik.
  • SoundOption enum'ini Stringga moslashtirdik β€” rawValue orqali fayl nomiga to'g'ridan-to'g'ri murojaat qilish imkonini oldik.
  • Audio fayllarni Bundle.maindan topib, do/try/catch bilan xatolarni boshqardik.

Yangi ovoz qo'shish juda oson: enum'ga yangi case qo'shib, loyihaga mos .mp3 faylni joylash kifoya.

Buy mea coffee