前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >macOS 应用开发小集锦

macOS 应用开发小集锦

作者头像
代码行者
发布2018-08-23 11:10:02
6860
发布2018-08-23 11:10:02
举报
文章被收录于专栏:macOS 开发学习macOS 开发学习

开发小集锦

记录开发中的琐碎技巧,以备查阅.

NumberFormatter
  • 将数字转为文字描述
代码语言:javascript
复制
 let formatter = NumberFormatter()
 formatter.numberStyle = .spellOut
 guard let words = formatter.string(from: 12320) else{ return }
 print("words = \(words)")
//结果: words = 一万二千三百二十

输出结果与当前app的语言环境有关(默认为English),如果需要修改工程的语言环境,需要设置Edit Scheme...

设置工程默认语言环境

weak 与 unowned

swift的闭包中我们在使用self时为了避免循环引用的问题,经常使用weak self 或者unowned self,这两种方式既相似又略有区别

  • [weak self]在闭包中的 self可选类型
代码语言:javascript
复制
HttpTool.request("your-url").complete{ [weak self] response in
 self?.mode = response.data
self?.updateUI()
}
  • [unowned self]在闭包中的self非可选类型: 因此若闭包执行前self被释放,会造成crash
代码语言:javascript
复制
HttpTool.request("your-url").complete{ [unowned self] response in
 self.mode = response.data
self.updateUI()
}
  • 推荐用法:
代码语言:javascript
复制
HttpTool.request("your-url").complete{ [weak self] response in
 guard let strongSelf = self else {return}
 self.mode = response.data
 self.updateUI()
}
NSBezierPath 转 CGPath
代码语言:javascript
复制
extension NSBezierPath {
    public var cgPath: CGPath {
        let path = CGMutablePath()
        var points = [CGPoint](repeating: .zero, count: 3)
        
        for i in 0 ..< self.elementCount {
            let type = self.element(at: i, associatedPoints: &points)
            switch type {
            case .moveToBezierPathElement:
                path.move(to: points[0])
            case .lineToBezierPathElement:
                path.addLine(to: points[0])
            case .curveToBezierPathElement:
                path.addCurve(to: points[2], control1: points[0], control2: points[1])
            case .closePathBezierPathElement:
                path.closeSubpath()
            }
        }
        
        return path
    }
}
获取你的公网IP地址

设置请求header后发送请求到http://ifconfig.me/ip,获取结果即可~(是不是很easy ^ _ ^ )

示例代码:

代码语言:javascript
复制
let headers: HTTPHeaders = [
      "User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6"
        ]
Alamofire.request("http://ifconfig.me/ip",headers:headers).responseString { (response) in
            print(response.result.value ?? "error")
        }
字符串插入分隔符与分隔词
代码语言:javascript
复制
var des = "Version"
let startIndex = des.startIndex
des.insert("-", at: des.index(startIndex, offsetBy: 4))    // 插入单个字母符号
des.insert(contentsOf: "hello", at: des.index(startIndex, offsetBy: 5))  // 插入多字符
print(des)  // 结果为Vers-helloion
文本朗读(iOS通用)

语音朗读

NSSpeechSynthesizer类提供了将文字转为语音的功能

代码语言:javascript
复制
 let speach = NSSpeechSynthesizer()
 speach.startSpeaking("Hello world")    // 开始朗读
  • 获取系统支持的朗读声音
代码语言:javascript
复制
for voiceName in NSSpeechSynthesizer.availableVoices {
       print(voiceName)
 }
// 输出结果
// VoiceName(_rawValue: com.apple.speech.synthesis.voice.Alex)
// VoiceName(_rawValue: com.apple.speech.synthesis.voice.alice)
// VoiceName(_rawValue: com.apple.speech.synthesis.voice.alva)
......
  • 设置朗读声音
代码语言:javascript
复制
let speach = NSSpeechSynthesizer()
let result = speach.setVoice(NSSpeechSynthesizer.VoiceName.init(rawValue: "com.apple.speech.synthesis.voice.damayanti"))
  if result {
      print("success")
  }else{
      print("failure")
  }
  • 监听朗读事件 设置代理
代码语言:javascript
复制
let speach = NSSpeechSynthesizer()
speach.delegate = self

实现相应的代理方法,监听事件回调

代码语言:javascript
复制
func speechSynthesizer(_ sender: NSSpeechSynthesizer, willSpeakWord characterRange: NSRange, of string: String) {
        print("will speaKWord \(string) \(characterRange)")
    }
func speechSynthesizer(_ sender: NSSpeechSynthesizer, willSpeakPhoneme phonemeOpcode: Int16) {
        print("will speakPhoneme \(phonemeOpcode)")
    }
func speechSynthesizer(_ sender: NSSpeechSynthesizer, didEncounterSyncMessage message: String) {
        print("did encounter message \(message)")
    }
func speechSynthesizer(_ sender: NSSpeechSynthesizer, didFinishSpeaking finishedSpeaking: Bool) {
        print("did finishedSpeaking ")
    }
func speechSynthesizer(_ sender: NSSpeechSynthesizer, didEncounterErrorAt characterIndex: Int, of string: String, message: String) {
        print("did error \(string)")
    }
添加系统提醒事件(iOS通用)

提醒事项

使用EKEventStoreEKReminder实现添加事件到系统的提醒应用

代码语言:javascript
复制
class ViewController: NSViewController {
  fileprivate let eventStore = EKEventStore()    // 建议使用单利模式
  fileprivate  var isAuthor = false     // 检测是否进行授权
  ... ... 
}

extension ViewController{
    fileprivate func remindme(){     
        // 获取系统的授权状态
        let authorStatus = EKEventStore.authorizationStatus(for: EKEntityType.reminder)
       // 判断授权结果     
        switch authorStatus {
        case .authorized:   // 已授权,设置授权结果为true
            isAuthor = true
        case .notDetermined:   // 尚未授权,进行授权请求(回调在子线程,若处理UI,需要切到主线程)
            eventStore.requestAccess(to: .reminder, completion: { [weak self] (granted, error) in
                guard let strongSelf = self else {return}
                if granted {
                    DispatchQueue.main.async {
                        strongSelf.isAuthor = granted
                        strongSelf.createRemind()
                    }
                }
            })
        case .denied,.restricted:  // 用户拒绝授权
            print("user deny ")
        }
        
        if !isAuthor {return}
        createRemind()
    }
    
    // 创建提醒
    fileprivate func createRemind(){
       
        let reminder = EKReminder(eventStore: eventStore)   // 创建提醒器
        reminder.calendar = eventStore.defaultCalendarForNewReminders() // 设置新提醒  
        reminder.title = "remide title"      // 设置提醒事件的标题
        let alarmDate = Date(timeInterval: 15, since: Date())   // 设置提醒时间:本例为15秒后
        let alarm = EKAlarm(absoluteDate: alarmDate)    // 创建提醒
        reminder.addAlarm(alarm)          // 添加提醒到提醒器中
        do {
            try  eventStore.save(reminder, commit: true)       // 添加事件到系统提醒应用
        } catch  {
            print("save failure: \(error.localizedDescription)")
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.03.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NumberFormatter
  • weak 与 unowned
  • NSBezierPath 转 CGPath
  • 获取你的公网IP地址
  • 字符串插入分隔符与分隔词
  • 文本朗读(iOS通用)
  • 添加系统提醒事件(iOS通用)
相关产品与服务
弹性公网 IP
弹性公网 IP(Elastic IP,EIP)是可以独立购买和持有,且在某个地域下固定不变的公网 IP 地址,可以与 CVM、NAT 网关、弹性网卡和高可用虚拟 IP 等云资源绑定,提供访问公网和被公网访问能力;还可与云资源的生命周期解耦合,单独进行操作;同时提供多种计费模式,您可以根据业务特点灵活选择,以降低公网成本。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档