code随手记

Practice from here


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 搜索
close

iOS数组防止越界crash

发表于 2016-12-24   |   分类于 iOS技术   |     |   阅读次数

有时候项目中总是出现一些无法预知的情况,导致数组越界是程序crash,如果这种意外情况无法避免,那么只能从侧面采取保护措施。我先从网上找答案,我想其他人也肯定遇到过相同的情况,如果有好的解决方案,直接采用就可以了。但是实际上,网上搜索的结果令人有些失望。下面还是记录一下我自己的解决方案,以及和网上解决方案的差异。

crash的具体几种情况

  • 取值:index超出array的索引范围
  • 添加:插入的object为nil或者Null
  • 插入:index大于count、插入的object为nil或者Null
  • 删除:index超出array的索引范围
  • 替换:index超出array的索引范围、替换的object为nil或者Null

解决思路

任何代码都需要围绕”高内聚,低耦合”的思想来实现,尤其是这种工具类的代码,更是应该对原代码入侵越少越好。一个很容易想到的方法,就是采用runtime, 把array中的以上几种情况的方法替换成自己的方法,然后再执行方法的时候加以判断。而我在网上搜到的结果全是以这种方案解决的,不排除有更好的方法我没找到。附上一个我找到的代码比较详细的demo。我试了一下,效果是可以达到,不过我还是毫不犹豫的拒绝这种方式。直接替换了系统的方法必然会导致更多无法预知的问题。这些问题,我在后面会讲几个我遇到的。而我准备这样解决:

阅读全文 »

Swift小结

发表于 2016-11-29   |   分类于 Swfit   |     |   阅读次数

懒加载

  • 格式 lazy var 变量: 类型 = { 创建变量代码 }()
  • 以 lazy var 开头,闭包末尾跟一个’()’
  • 懒加载的写法本质上是定义并执行一个闭包
  • 好处:没有解包的麻烦,并且 延迟创建
  • 与OC懒加载的区别:这里的懒加载只会执行一次,如果中途被设置成nil,也不会再次执行
    懒加载完整的写法:
    eg:懒加载一个数组
1
2
3
lazy var dataList: [String] = { () -> [String] in
        return ["zero","one", "two"]
}()

in 和 前面的代码块可以省略,写成这样

1
2
3
lazy var dataList: [String] = {
        return ["zero","one", "two"]
}()

后面的闭包和括号也能省略,这种写法是最为简洁的懒加载形式,一般这样写就可以了

lazy var dataList: [String] = ["zero","one", "two"]

比如懒加载一个label

lazy var label: UILabel = UIlabel()

如果对label需要添加其他属性,就可以写成带()的

1
2
3
4
5
6
lazy var label :UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 15)
label.textColor = UIColor.red
return label
}()
阅读全文 »

swift自动布局

发表于 2016-11-24   |   分类于 Swfit   |     |   阅读次数

苹果原生自动布局

  • 自动布局核心公式

view1.attr1 = view2.attr2 * multiplier + constant

  • 自动布局构造函数
1
2
3
4
5
6
7
8
NSLayoutConstraint(item: 视图,
attribute: 约束属性,
relatedBy: 约束关系,
toItem: 参照视图,
attribute: 参照属性,
multiplier:乘积,
constant:约束数值
)
阅读全文 »

iOS语音识别

发表于 2016-11-16   |   分类于 iOS技术   |     |   阅读次数

公司项目需要实现语音搜索,正好记录一下这个iOS10新出的API。

iOS10是一个变化比价大的版本,开放了很多接口,这样也更方便开发者自定义各种功能。本文主要讲解一下新增的Speech框架,有了这个框架,我们想要为自己的app增加语音识别功能,不要依赖第三方的服务,几十行代码就可以轻松搞定。demo地址在文章末尾。

一:基本配置

  • Xcode8,iOS10系统真机
  • 导入头文件:OC #import<Speech/Speech.h> swift import Speech
  • 配置info.plist文件:配置两个权限,语音识别和麦克风
1
2
3
4
5
<key>NSMicrophoneUsageDescription</key>
<string>Your microphone will be used to record your speech when you press the "Start Recording" button.</string>

<key>NSSpeechRecognitionUsageDescription</key>
<string>Speech recognition will be used to determine which words you speak into this device's microphone.</string>

二:用到的几个类

AVAudioEngine 语音引擎,负责提供语音输入
SFSpeechAudioBufferRecognitionRequest 处理语音识别请求
SFSpeechRecognizer 语音识别器
SFSpeechRecognitionTask 输出语音识别对象的结果
NSLocale 语言类型
语音识别一共就用到了这几个类,整体的流程也容易理解,语音识别器通过语音引擎,处理语音识别请求,把结果交给SFSpeechRecognitionTask处理,最后输出文字。
SFSpeechRecognizer 自身有几个代理方法,实际上,如果只是将语音转化成文字,是不需要这几个代理方法的。

阅读全文 »

1…8910…12
夜千寻墨

夜千寻墨

扫码关注微信公众号,及时获取文章更新

48 日志
10 分类
77 标签
RSS
GitHub Weibo 简书 instagram
© 2020 夜千寻墨
powered by Hexo
theme - Next
本站访客数人次 总访问量次