2017年4月20日木曜日

AVSpeechSynthesizerでテキスト読み上げ

 テキストだけ差し替える方法があるかもしれないけど、読み上げテキストで初期化する方法でも大丈夫。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var talker = AVSpeechSynthesizer()
    let talkTxt = "こんにちわ、今日はいい天気ですね"
    let talkText2 = "テキスト2"
    let talkTextEng = "hello"
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       
        // 読み上げ内容を初期化
        var utterance = AVSpeechUtterance(string: talkTxt)
        // 日本語
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        // 読み上げ
        self.talker.speakUtterance(utterance)

        // 2回目
        utterance = AVSpeechUtterance(string: talkText2)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP") // defaultは英語なので毎回指定
        self.talker.speakUtterance(utterance)

        // 英語文を日本語で(読める)
        utterance = AVSpeechUtterance(string: talkTextEng)
        utterance.voice = AVSpeechSynthesisVoice(language: "ja-JP")
        self.talker.speakUtterance(utterance)

        // utterance.speechString = "こんにちわ"  // get onlyなのでテキストのみ差し替えはできない?
        // self.talker.speakUtterance(utterance)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

2017年4月5日水曜日

optionalとアンラップ

- nilを許可する場合はOptional型として "?"をつける
- 使用するときはアンラップ < "!"で強制アンラップ
  let unlap = optionalString! 
- オプショナルバインディングで安全にアンラップ
  if let opt = optionalString {   // オプショナルバインディングでfalse
      print("アンラップしました -> " + opt)
  }

// optionalとは??
var nonOptionalString:String = "hello"  // optionalじゃなくString型
print(nonOptionalString)

nonOptionalString = "hoge"
print(nonOptionalString)

// nonOptionalString = nil     // ここでエラー "nil cannot be assigned to type 'String'
// print(nonOptionalString)     // nilを入れることが出来ない為

// optional型で宣言
var optionalString:String? = "hello"    // ?をつけるとOptional型になる
print(optionalString)           // Optinal("hello")と表示される

optionalString = nil        // nil代入もOK
print(optionalString)       // "nil"と表示される

if let opt = optionalString {   // オプショナルバインディングでfalse
    print("アンラップしました -> " + opt)
} else {
    print("nilが入っている")  // こっちが表示される
}

optionalString = "hoge"
if let opt = optionalString {   // オプショナルバインディングでアンラップ
    print("アンラップしました -> " + opt)    // アンラップされたこっちが表示される
} else {
    print("nilが入っている")
}

2017年4月2日日曜日

http requestをNSURLSessionのdelegateで

NRURLSessionでhttp requestの結果をdelegateで受けてみます。

//
//  ViewController.swift
//

import UIKit

class ViewController: UIViewController, NSURLSessionDelegate, NSURLSessionDataDelegate {

    @IBOutlet weak var urlDataDisp: UITextView!
   
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
       
        getUrlData("http://tantan2014.blogspot.jp/2017/01/mapkit-viewannotation.html")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func getUrlData(targetUri: String){
        // 通信用のConfigを生成.
        let config: NSURLSessionConfiguration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("backgroundTask")
        // Sessionを生成.
        let session: NSURLSession = NSURLSession(configuration: config, delegate: self, delegateQueue: nil)
        // 通信先のURLを生成.
        let url: NSURL = NSURL(string: targetUri as String)!
        // タスクの生成.
        let task: NSURLSessionDataTask = session.dataTaskWithURL(url)
        // タスクの実行.
        task.resume()
    }
   
    /*
     通信が終了したときに呼び出されるデリゲート.
     */
    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
        print("NSURLSessionDataTask")
       
        // 帰ってきたデータを文字列に変換.
        let getData: NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!
       
        // バックグラウンドだとUIの処理が出来ないので、メインスレッドでUIの処理を行わせる.
        dispatch_async(dispatch_get_main_queue(), {
            self.urlDataDisp.text = getData as String
        })
    }
   
    /*
    
     バックグラウンドからフォアグラウンドの復帰時に呼び出されるデリゲート.
    
     */
    func URLSessionDidFinishEventsForBackgroundURLSession(session: NSURLSession) {
       
        print("URLSessionDidFinishEventsForBackgroundURLSession")
       
    }
}



ご説明はこちらが詳しいです。
http://qiita.com/aKentaKoyama/items/96a979ab3a140e7b39ec