这两天继续踩坑,在写swift的时候,遇到不少可笑的事情。对oc熟悉一段时间突然写swift 会多少有点不习惯。除了语法外,还有一些很细微的地方有时候让人感觉奔溃。在一个类声明一个字典,本来是一件很平常时候,有时候xcode却一直报错是单例缺少init,很莫名奇怪的错误,解决时候,却发现声明字典的时候出现了误导自己。
今天就是因为下面这个错误一直误导自己,犯下了一些错误。今天记录下来。
1.声明字典的坑
var soundDictionary = [String,UInt32]()
var idw:SystemSoundID = 0
soundDictionary["w"] = idw//这样赋值会出现错误
var dic = Dictionary<String,UInt32>()
dic["ok"] = 34
var dic2:Dictionary = Dictionary<String,UInt32>(minimumCapacity: 4);
dic2["q5"] = 43
dic2["q4"] = 43
dic2["q3"] = 43
dic2["q2"] = 43
2、播放音效的坑
除了练习外,收到一个声音上的需求,播放一个音效。也遇到一个坑就是采用 AudioServicesPlaySystemSound(soundId) 播放音频在模拟器上没有声音,在真机的时候有。在查阅stackflow的时候也有很多人遇到想同的问题,真机有事,模拟器没事。各种奇怪的事情。同样使用AudioServicesPlaySystemSound 播放的时候 对音频格式要求,使用mp3的时候却播放不出来。奇怪的事情也是因为对API使用不熟悉。最不查阅的时候,没有错,却发生异常情况。可能是设置,也有可能是一行代码影响了。所以说在学这个的时候会发生很多郁闷的事情。
使用AVAudioPlayer 播放会比较容易和成功,调试的时候比AudioServicesPlaySystemSound 顺利得多。因此在开发过程中,遇到这个还真挺郁闷的。
明天继续。
3、AVAudioPlayer播放的坑
之前发生过一个坑,AVAudioPlayer 对象很快就收回导致发不出声音,于是采取了声明强引用才没有事。顺带一下,NSBundle 还真很多API,URL开头的还真不少,这个封装有利于返回一个URL对象,便于AVAudioPlayer 参数使用。
(void) playMusicWithName:(NSString *) name loops:(NSInteger) loops
{
NSURL *url = [[NSBundle mainBundle] URLForResource:name withExtension:nil];
NSError *error = nil;
audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:&error];
if(loops > 0) audioPlayer.numberOfLoops = loops;
[audioPlayer play];
}