質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1555閲覧

Swift オプショナルの扱いに関して

Susanoo2442

総合スコア153

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/07/20 00:06

質問です。

現在、サンプルアプリとして
リアルタイム双方向通信を可能とした

チャットアプリをIOS用に開発しております。

サーバーサイドはNode.jsで
開発言語はSwiftになります。

ライブラリはSocket.IO_client_swiftをPodにて
インストールしております。

そして、今回の質問ですが
まずは、コードを見て頂きたいです。

Swift

1 2import UIKit 3import SocketIOClientSwift 4 5class ViewController: UIViewController { 6var socket: SocketIOClient! 7 8 @IBOutlet weak var sigoku: UITextField! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 // Do any additional setup after loading the view, typically from a nib. 14 15 let socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080/")!, options: [.Log(true), .ForcePolling(true)]) 16 17 18 socket.on("connect") { data, ack in 19 print("socket connected!!") 20 } 21 22 23 socket.connect() 24 25 26 27 } 28 29 30 31 32 33 34 35 36 37 38 override func didReceiveMemoryWarning() { 39 super.didReceiveMemoryWarning() 40 // Dispose of any resources that can be recreated. 41 } 42 43 @IBAction func baki(sender: AnyObject) { 44 45 46 var nume = sigoku.text! 47 48 49 50 51 socket.emit("subaki",nume) 52 53 54 55 56 57 //socket.emit("subaki",nume) 58 59 60 61 62 63 } 64 65 66}

アプリの仕様ですが
とりあえず、今の段階では
アプリを開いて
テキストフィールドに文字を入力して
送信ボタンを押すと

Socket.emitでsubakiというイベント名で
サーバーにnumeというデータオブジェクトを発信して
それを待ち受けているサーバーがコールバック関数で引き受けて
サーバーのコンソールに先ほどテキストフィールドに入力した
文字を出力するといった流れです。

しかしながら送信バタンを押す、もしくは初期状態から
SocketにNilが入っているため
アプリが落ちます。

こちらをオプショナル型で宣言すれば
たしかにNilが入っても問題ないため
アプリケーションは落ちませんが

オプショナル型のままではサーバーがデータオブジェクトを
取り扱うことができません。

ですから、例えば、Socket = nil の場合に
Socktに値を導入するなどして

Sockt = nil の時にアプリケーションを
落ちなくする手法を知りたいです。

どなたら、ご教示して頂ければと思います。
お手数おかけしますが
何卒、ご回答の方宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

var socket: SocketIOClient!

上記をインスタンス変数として保持しているので、インスタンス変数に代入するようにすれば良いのではないでしょうか。

swift

1import UIKit 2import SocketIOClientSwift 3 4class ViewController: UIViewController { 5 6 var socket: SocketIOClient! 7 8 @IBOutlet weak var sigoku: UITextField! 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 13 socket = SocketIOClient(socketURL: NSURL(string: "http://localhost:8080/")!, options: [.Log(true), .ForcePolling(true)]) 14 15 socket.on("connect") { data, ack in 16 print("socket connected!!") 17 } 18 socket.connect() 19 } 20 21 @IBAction func baki(sender: AnyObject) { 22 23 let nume = sigoku.text! 24 socket.emit("subaki",nume) 25 } 26 27 override func didReceiveMemoryWarning() { 28 super.didReceiveMemoryWarning() 29 } 30}

投稿2016/07/20 04:18

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Susanoo2442

2016/07/20 05:53

ありがとうございます。 無事、問題が解決されました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問