ポインタの配列を利用したい

投稿者: Anonymous private var test1: Int = 0 private var test2: Int = 0 private var test3: Int = 0 private var testArray: [Int] { get { return [test1, test2, test3] } } 上記とすることで配列定義できることを教えていただいたのですが、 ポインターの配列とすることはできないのでしょうか。 下記のようではだめでした。 private var testArray: [UnsafePointer<Int>] { get { return [&test1, &test2, &test3] } } 解決 Swiftでは&記号は”address of”演算子ではなく、単にinoutパラメータであることを明示する(それによって関数呼び出しで値が変更される可能性があることをプログラマーに意識させるという効果があります)だけのもので、関数(メソッド含む)呼び出し以外では、ポインターを取得することはできません。 関数呼び出しなら良いんでしょということでこんな関数を使うことができるんですが、 private var…(Continue Reading)

Swiftのネストを浅くしたい

投稿者: Anonymous 以下のSwiftコードのネストを浅くしたいのですが、いい案はないでしょうか? task = URLSession.shared.dataTask(with: URL(string: url)!) { (data, res, err) in if let obj = try! JSONSerialization.jsonObject(with: data!) as? [String: Any] { if let items = obj["items"] as? [[String: Any]] { self.repo = items DispatchQueue.main.async { self.tableView.reloadData() } } } } 解決 はじめまして、URLSessionで非同期なので、タイミングによってはselfが解放されている可能性まで考えてのコードです。 guard文の多用になってあまりすっきりはしていないかも知れませんが、あえて guard let a = b, let c = dの様な一つのguard文で複数のチェックを行う事は今回は避けています。…(Continue Reading)

絵を描くアプリで線はundo,redoできるのですがimageviewがundo,redoできません。

投稿者: Anonymous スクロールビューの下にimageViewを配置してあります。 @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var canvasView: UIImageView! var saveImageArray = [UIImage]() //Undo/Redo用にUIImage保存用 // タップされた座標にflowerを追加する(buttonをクリックした時の処理) let flower = UIImageView(image: UIImage(named: “flower”)) flower.center = (sender as AnyObject).location(in: self.view) **canvasViewの拡大を可能にしたい為、addSubView(flower)にしたら簡単にタップ位置にimageの大きさで表示されかつ拡大出来たので良かったのですが、結果としてSubViewとcanvasViewでは格納場所が違うようで以降のundo処理が出来ない状態です。 描いた線,画像の拡大,縮小が出来てundo,redo処理が出来る様に考えています。 現在の記述で描いた線,画像の拡大,縮小は出来るのだが,画像のredo,undoが出来ないです。 (この処理の中には線の記述はないです) canvasView.addSubview(flower) //配列にcanvasView.imageを保存 currentDrawNumber += 1 saveImageArray.append(canvasView.image!) //保存している直前のimageに置き換える (undoボタンをクリツクした時の処理) @IBAction func pressUndoButton(_ sender: Any) { if currentDrawNumber <= 0 {return}…(Continue Reading)

swiftでのアプリ制作でエラー内容がわからない

投稿者: Anonymous swift、Xcode9.0でクイズアプリを作っています。 アプリ作りは初めてでプログラミング言語自体入門者です。 シミュレータでうまくアプリが動きません。 コンパイルは成功するのですが、シミュレータにLaunch画面以外表示されず、 viewControllerの以下の数カ所にエラーコードが出てしまいます。 以下の部分は赤く染まり、Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)と表示 func Hide(){ LabelEnd.isHidden = true Next.isHidden = true 以下の部分も上記と同じくBAD_INSTRUCTIONと表示 override func viewDidLoad() { super.viewDidLoad() Hide() RandomQuestions() デバッグエリアに fatal error: unexpectedly found nil while unwrapping an Optional value と表示されているので、 コードにあるoutlet接続とaction接続をstoryboardと再接続をしましたが、 問題は解決されません。 どこに問題があるのか教えていただけないでしょうか。 どうかご教授お願いします。 独力ではお手上げ状態です。 アプリ作りを始めて10日目。 もう挫折しそう、、、。 import UIKit class ViewController: UIViewController { @IBOutlet weak…(Continue Reading)

UITableViewCellのimageViewのサイズ

投稿者: Anonymous storyboradにて、UITableViewにUITableViewCellを配置し、cell内のimageViewの高さを autolayoutで可変(画面サイズによって)にしています。 この時、コードの中で、そのimageViewを正円にしようとしているのですが imageView.frameのサイズが初回描写時とスクロールした時で異なっていて、 初回描写時だけうまく正円にならず、困っています。 tableViewをスクロールすると、再描写?して正円になり、以降はずっと正円となります。 func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell { let cell = tableView.dequeReusableCellWithIdentifier(“sampleCell”, forIndexPath: indexPath) let imageView = cell.viewWithTag(1) as ! UIImageView ・・・ // 画像を正円にする print(imageView.frame.size.height) // ←初回とスクロール時で値が異なる。(初回のみ82、以降は64) imageView.layer.cornerRadius = (imageView.frame.size.height * 0.5) imageView.layer.masksToBounds = true } 初回から正しく正円にするため、imageViewのサイズを正しく取れる方法はありますでしょうか。 解決 ほかにもアイデアはいくつもあるでしょうが、ひとつのアイデアとして、つねに円形になる、UIImageViewのサブクラスを使用することを考えてみます。 class RoundImageView: UIImageView { override func layoutSubviews() { super.layoutSubviews()…(Continue Reading)

破棄ボタンを押したタイミングで保持していたviewControllerを解放したい

投稿者: user15219 storyboardの構成は以下です。 破棄ボタンを押した時に下記の処理を入れています。 let storyboard = UIStoryboard(name: “Main”,bundle:nil) let vc = storyboard.instantiateViewControllerWithIdentifier(“Top”) UIApplication.sharedApplication().keyWindow?.rootViewController = vc しかし、以下のようにもともと表示されていたviewの上に新たなwindowが作られてしまいます。 もともとのviewControllerを解放して、topページに遷移させるには、上記コードをどのように書き換えればよいのでしょうか? コメントいただいたコードを追加したところ、下記のようになりました。 deinitは呼ばれ、解放はされました。 コードは以下のようにしました UIApplication.sharedApplication().keyWindow?.rootViewController? .dismissViewControllerAnimated(true, completion: nil) let storyboard = UIStoryboard(name: “Main”,bundle:nil) let vc = storyboard.instantiateViewControllerWithIdentifier(“FBLogin”) UIApplication.sharedApplication().keyWindow?.rootViewController = vc 解決 iOSでの画面遷移はViewControllerをスタック状に積み重ねることで実現されています。RootViewControllerの子孫階層のViewControllerを解放してしまえば良いので、次のようなコードで実現できるはずです。お試しください。 UIApplication.sharedApplication().keyWindow?.rootViewController? .dismissViewControllerAnimated(true, completion: nil) 回答者: Anonymous

UIAlertControllerで押されたボタンをTrue/Falseで取得したい

投稿者: Anonymous UIAlertControllerを使用して「OK」と「キャンセル」のボタンを持ったActionSheetを表示し、 「OK」の場合trueを、「キャンセル」の場合falseを返す関数を実装したいと考えています。 以下のように実装してみたのですが、ユーザーの選択を待たずに関数が終了してしまいます。 ユーザーの選択を戻り値と取得するにはどのようにするのが良いでしょうか? アホな質問で申し訳ありませんが、よろしくお願いいたします。 /// 確認メッセージ表示 class func confirm(vc: UIViewController, strMsg: String, strTitle: String = “”) -> Bool { var ret: Bool = true let dialog = UIAlertController(title: strTitle, message: strMsg, preferredStyle: .ActionSheet) let act1 = UIAlertAction(title: “OK”, style: .Default) { action in ret = true } let act2 = UIAlertAction(title: “キャンセル”,…(Continue Reading)

SIGABRTと表示される

投稿者: Anonymous https://akira-watson.com/iphone/tableview_3.html 上記のサイトにあるコードを写経しているのですが、実行すると let subVC: SubViewController = (segue.destinationViewController as? SubViewController)! の部分が SIGABRTと表示されます。 SIGABRTとはコードを入力する順番が違う、某サイトで見たのですが、今回もそういうことなのでしょうか。。。 import UIKit class ViewController: UIViewController , UITableViewDataSource, UITableViewDelegate{ @IBOutlet var table:UITableView! let imgArray: NSArray = [“img0.png”, “img1.png”, “img2.png”, “img3.png”] let label2Array: NSArray = [“あ”, “い”, “え”, “う”] var selectedImage: UIImage? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after…(Continue Reading)

Cannot invoke ‘atan2’ with an argument list of type ‘(Double)’というエラーが出ます。

投稿者: Anonymous Swiftにて以下の様にコードを書いたところ、Cannot invoke ‘atan2’ with an argument list of type ‘(Double)’というエラーが出ます。 let with = 4.0 let pWidth = 0.6 let r = (with/2) – pWidth let atan = atan2((pWidth / 2) / r)//ここにエラーが出ます。 これはどの様な原因で起こっているのでしょうか。 型による問題が起きているという事でしょうか。 すいません、宜しくお願い致します。 解決 atan2は座標(x, y)と座標(0, 0)を結んだ線の角度θを求める関数なので、引数が1つ足りないというエラーです。 この場合はatan((pWidth / 2) / r)で充分かと思われます。 回答者: Anonymous

Firebase Crash の設定で「Command not found」

投稿者: Anonymous FirebaseのCrash Reportingの機能を使いたいと思い、現在設定をしております。 クラッシュデータをFirebase consoleに表示させることはできたのですが、 シンボルファイルのアップロードの設定で困っています。お知恵をお貸しください。 プロジェクトフォルダ直下に「FirebaseCrash」フォルダを作成して以下のようにファイルを配置し、[Run Script]を設定しました。 公式サイト(https://firebase.google.com/docs/crash/ios#upload_symbol_files) の手順ではpodを使用していますが、podが何かよく分からない為使用せず、パスを変更しています。 ビルドすると「permission denied」と出たので、jsonファイルのパーミッションを644から744に変更したところ、今度は「Command not found」と出るようになりました。 なんのことやらさっぱり分からずです。podを使用していないことが原因でしょうか?^^; このエラーの回避策をお教え頂けますと大変助かります。 どうぞよろしくお願いいたします。 解決 firebaseに関連するコマンドがインストールされていないようなので、とばしてしまったpodに関する作業を行うことで解決するように思えます。 以下のwebページ等を参考に設定してみてはいかがでしょうか。 https://cocoapods.org/ http://qiita.com/satoken0417/items/479bcdf91cff2634ffb1 回答者: Anonymous

memcopy()やmemclear()のようなものは無いのでしょうか。

投稿者: Anonymous class Test : NSObject { var testUint8: UInt8 = 0x00 var testNSNumber: NSNumber = NSNumber(unsignedChar: 0x00) } var test1 = Test() var test2 = Test() // 値を変えておく test1=test2 上記で値は更新されるのですが、 test1の領域(アドレス)にtest2の中身が「=」でコピーされるということでしょうか。 以下と同意なのでしょうか。 test1.testUint8 = test2.testUint8 test1.testNSNumber= test2.testNSNumber 解決 test1の領域(アドレス)にtest2の中身が「=」でコピーされるということでしょうか。 コピーされるのは、「中身」ではなくて、アドレスです。なので、test1をあらかじめイニシアライズする必要はないです。 var test2 = Test() var test1 = test2 アドレスのコピーなので、test2のプロパティの値に変更を加えると、test1のプロパティの値も変わります。同一のインスタンスを参照しているのですから、そうなります。 test2.testUint8 = 20 print(test1.testUint8) // 20…(Continue Reading)

XcodeでMGIsDeviceOneOfType is not supported on this platform.と表示されてしまいます

投稿者: Anonymous XcodeをVersion 10.0 (10A255)にバージョンアップしました。SwiftのプラグラムをiPhone8 Simulatorで実行すると以下のエラーが表示されるようになりました。また、iPhone X/XR/XS/XS MaxのSimulatorでは以下のエラーは表示されません。なにか、地図関係か何かに変化があったのでしょうか? ご存知の方があれば ご教授ください。 2018-09-19 14:41:26.945506+0900 VoiceToDo1[13120:353456] libMobileGestalt MobileGestalt.c:890: MGIsDeviceOneOfType is not supported on this platform. 解決 同内容のスレッドが、AppleのDeveloper Forumsにありました。 What is MGIsDeviceOneOfType 残念ながらAppleの技術者からのコメントはありませんが、「新しいSDKにありがちな、フレームワークの内部メッセージ(フレームワーク開発者が仕込んだデバッグメッセージ)だろう。今の所実害はないし無視して大丈夫そうだ。」と言うところに落ち着いたようです。 本家StackOverflowのスレッドがこちら。 Xcode Error on Simulation 回答ではなくコメントに「シミュレータじゃなくデバイスで実行(Xcode10正式版、10A255のこと)したらメッセージは出ない」と言う報告もあるので、やはり無視しても問題ないのではないかと思われます。 何やら「自分はこうしたら解決した」と言うやり方を書いている方もいるのですが、それが正しい解決方法だと言う確証がないので、たまたまいろんな要因が重なってその時点で解決できたように見えただけ、と言う可能性も高そうです。 下手に真似すると自分のプロジェクトを壊してしまう可能性もあるので、メッセージが出てくる以外に実害が無いのでしたら、無視した方が良いのではないかと思います。(AppleのSDKの一部には、そんなメッセージが出るものが時々あります。) 回答者: Anonymous

他のファイルからViewControllerのUILabelを変更したい

投稿者: Anonymous 実現したいこと・問題点 Swift初心者です。 表題の通り、他の.swiftファイルから直接、ViewController.swiftに関連付けされているUILabelのテキストを変更することはできないかと思い、後述のようなコードを書きました。 storyboard上にSliderとLabelを配置し、Sliderを変更した際の処理をLowPass.swift内に記述するというようにしています。 このまま実行するとビルドはされるのですが、Sliderの値を変更するとエラーが出てしまいます。 エラーの原因は、LowPass.swiftのvcにnilが入ってしまっていることだとは分かるのですが、改善策が分かりません。 どなたかご教授頂けますでしょうか。 該当のソースコード //ViewController.swift import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! @IBOutlet weak var slider: UISlider! // LowPass.swiftのインスタンス生成 let lowPass = LowPass() override public func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. slider.maximumValue = Float(150)…(Continue Reading)

Swift コードで追加した複数のボタンにオートレイアウトの制約をつけたい

投稿者: Anonymous @IBOutletで複数のボタンを追加しておくと、どれぞれにオートレイアウトの制約をつけることができますが、@IBOutletなしでループでボタンを追加した場合、それぞれのボタンにオートレイアウトの制約をつける方法がわかりません。 @IBOutletを使わないのは、前もってボタンの数だけ@IBOutlet var ボタン名:UIButton!を用意する必要があるとの理解からです。 使わない方がスッキリすると考えていることと、ボタンの数が変動するからです。 テストにしているコードを記します。 KeyboardExtentionでの作成において、オートレイアウトでの要素配置が必須ということで、オートレイアウトの制約を設定する必要があり、方法を探しております。 どのように改良すべきか、別の方法の検討が必要なのか、ご提案や改善策をいただければ幸いです。 よろしくお願いいたします。 import UIKit class KeyboardViewController: UIInputViewController { @IBOutlet var nextKeyboardButton: UIButton! override func viewDidLoad() { super.viewDidLoad() // Perform custom UI setup here self.nextKeyboardButton = UIButton(type: .system) self.nextKeyboardButton.setTitle(NSLocalizedString(“Next Keyboard”, comment: “Title for ‘Next Keyboard’ button”), for: []) self.nextKeyboardButton.sizeToFit() self.nextKeyboardButton.translatesAutoresizingMaskIntoConstraints = false self.nextKeyboardButton.addTarget(self, action: #selector(handleInputModeList(from:with:)), for: .allTouchEvents)…(Continue Reading)

.plistから読み込んだ文字列がnで改行されない

投稿者: Anonymous プロパティリストから読み込んだ文字列を改行してUILabelに表示したいのですが、 「1行目n2行目」という形で nがそのまま表示されて改行されません。 プロパティリストには画像のように入力しています。 func loadTitles() { let path = NSBundle.mainBundle().pathForResource(“DefaultValues”, ofType: “plist”) let array = NSArray(contentsOfFile: path!)! as! [NSDictionary] for i in 0..<array.count { let item = array[i] let title = item[“title”] as! String let label = UILabel() label.text = title//「1行目n2行目」と表示される //1行目 //2行目 //と表示したい } } 解決 簡単で済みませんが、nは文字列ですので今の結果は当然の結果になります。 改行を含むValueを持つプロパティリストを作成するには、 1行目Option+Return 2行目 の様に打ち込んで下さい。これで、plist…(Continue Reading)

UIbutton(Any)の表示・非表示設定

投稿者: Anonymous 環境 swift3 Xcode9.0.1 内容 Storyboard内に用意したボタンを特定の条件下で表示/非表示にしたいのですが @IBAction func button(_ sender: Any){ 処理… } と定義したボタンを”viewDidLoad”内で button.isEnable = false としてもエラーが出てしまいます。 この”button”を非表示にする方法を教えてください。 解決 表示/非表示にしたいのであれば、 button.isEnable = false ではなく button.isHidden = true でうまくいかないでしょうか? 回答者: Anonymous

Swiftでinitに?がついてるときはどういう意味ですか?

投稿者: Anonymous Swiftで以下のように init に ? が付いてる時はどういう意味ですか? また これを ! で外す時は guard let … ?? でいいですか? required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.copyInit() } 解決 initに?がついてるときはどういう意味 公式のSwift本でFailable Initializerと呼ばれているものです。直訳すれば「失敗する可能性のあるイニシャライザ」と言うことになりますが、初期化の途中で失敗する可能性があり、失敗した場合には結果がnilになると言うイニシャライザです。 これを!ではずす 「!ではずす」と言う言い方は意味をなさないので何のことかわかりませんが、強制アンラップ(!)を使わずに安全に使用したい場合、guard letに代表される条件付きバインディングを用いたり、??演算子でnilの場合のデフォルト値を補ってやると言うのは、Optional型を返すメソッドと同じになります。 回答者: Anonymous

App storeへのRealm使用アプリの申請の際のスキーマバージョンについて

投稿者: Anonymous App StoreにあがってるアプリはRealmを初めて使ったままのスキーマ定義なのでスキーマは変更しておりません。それゆえ、configやスキーマバージョンも書いておりません。 スキーマ定義を変更する必要が出たので今回ローカル上でスキーマのバージョンを上げてマイグレーション処理を行ったりと色々試行錯誤しましたがうまくいかなく、Simulatorで一度アプリを削除してバージョンを0にしたところビルドもマイグレーションもできました。 ただApp store上のアプリはdidFinishLaunchingWithOptionsで定義をせずにアプリを申請していたため、次にアプリをアップデートする際にはdidFinishLaunchingWithOptionsのブロック内にスキーマバージョンを上げて記述し、書かなければならないのですがこの際の値は0で問題ないのでしょうか。 解決 Realmのファイルは各ユーザーのデバイスにそれぞれファイルが存在するわけですので、手元でアプリを削除してうまくいってもリリースされたアプリを使うユーザーのデバイスではそうはなりません。すでにそのアプリを利用しているユーザーのデバイスには変更前のスキーマのファイルがあるので、アプリをバージョンアップした際にはスキーマが一致しないので、スキーマバージョンを上げていなければクラッシュします。 まだアプリをAppStoreで配布してなければ、もちろん開発時は自由に試行錯誤できますが、一度リリースしてしまったなら、アップデートでスキーマを変更するならスキーマバージョンも合わせて上げる必要があります。 ただし、既存のデータを消してしまってもいいのであれば、Realm.RealmConfiguration.deleteRealmIfMigrationNeededプロパティを使うと、マイグレーションが必要な場合は自動的に既存のファイルを消して作り直すということを自動的にやってくれます。 スキーマバージョン0から1のマイグレーション時はデータ削除、1から2のマイグレーション時はデータ移行をする、としたい場合は、私なら下記のように書きます。条件に応じてdeleteRealmIfMigrationNeededプロパティを切り替える方法よりも意図が明確になります。 let config = Realm.Configuration(schemaVersion: 2, migrationBlock: { (migration, schemaVersion) in if schemaVersion < 1 { migration.deleteData(forType: “ModelA”) migration.deleteData(forType: “ModelB”) migration.deleteData(forType: “ModelC”) } if schemaVersion < 2 { migration.enumerateObjects(ofType: “ModelA”) { (newObject, oldObject) in … } migration.enumerateObjects(ofType: “ModelB”) { (newObject, oldObject) in … }…(Continue Reading)

CaseIterableはSwift4.2から使えるとネットにあるが、Swift4で動いているように感じる

投稿者: Anonymous 画像のようにSwift4を設定しています。 ネットにはSwift4.2から使えると書いています。 しかしCaseIterableを書いてみるとコンパイルが通り正常に動きました。 なぜでしょうか? 参考: – https://www.hackingwithswift.com/articles/77/whats-new-in-swift-4-2 – https://dev.classmethod.jp/smartphone/iphone/wwdc18-swift-4-2-case-iterable/ 解決 Swift 4どころか、Swift 3を指定しても、CaseIterableが使えませんか? Xcode 10.xに付属するSwiftコンパイラは、Swift 4.2.xであり、リンクされるSwift標準ライブラリもSwift 4.2用のものです。 Build Settingsにある、Swift Language Versionは、あくまでもSwift 4.2コンパイラをどのモードで走らせるかという指定であり、動作がSwift 3コンパイラやSwift 4コンパイラと全く同じになるわけではありません。Swift 4.2で導入された機能のうち、Swift 3モードやSwift 4モードの動作と矛盾しないものは、それらのモードを指定しても使えたりします。 また構文は全く変わらないままSwift標準ライブラリの挙動が変更になっている場合などは、Swift 3/4を指定していても、Swift 4.2標準ライブラリの挙動となります。 CaseIterableの他にもSwift 4.2で導入された機能(下の例はoffset(of:))がSwift 3/4モードで動くかと思います。試してみてください。 struct MyStruct { var i32: Int32 var i16: Int16 } if let offs = MemoryLayout.offset(of: MyStruct.i16) { print(offs) //-> 4…(Continue Reading)

演算子のプロトコルについて

投稿者: Anonymous 例えば、あるクラスでAプロトコルを採用した場合、 プロトコルの宣言内容に沿って、 クラスの内にインスタンスメソッド・プロパティ等を定義します。 しかし演算子のプロトコル(例えば、Equatable, Comparableなど)を採用した場合、 定義は、グローバル関数として実装します。 なにか仕様的に矛盾している感じがあり、理解できません。 演算子のプロトコルを採用した場合、実装がグローバル関数でよいのか、教えてください。 解決  一般のプロトコルは、そのクラスに「機能」を付加したい時に使うのでクラス内で実装を行いますが、演算子は、そのクラスと別の何か(同じクラスかもしれないし別のクラスかもしれない)との「関係」を付加したい時に使うので、そのクラスの外で定義した方が自然ではないでしょうか。   回答者: Anonymous

@State付きの変数の値の初期化が無効になる

投稿者: Anonymous 以下のコードは、words1という配列がinit内で値が代入され、その後for文を使い、配列words2へ同じ要素を追加するものです。 ですが、words2に@Stateが付いているとwords2.countのように要素の数を調べた時に0となっています。 どうして初期化処理が無効化されたかのようになっているのでしょうか? import SwiftUI struct hoge{ var words1:[String] @State var words2:[String] = [] init(){ self.words1 = [“hello”,”world”,”programming”,”Swift”] for word in self.words1{ self.words2.append(word) } } } var something = hoge() print(something.words2.count) 解決 結論を先に書くと、 @Stateを付けたプロパティは、イニシャライザの中で値を変更しても必ず無視されます。 残念ながら、@Stateの詳細についてきちんと解説した記事を見つけ出すことはできなかったのですが、Swift言語開発のコアメンバーでもあるJoe Groff氏が書いている記事が見つかりました。 forums.swift.orgの@State messing with initializer flowというスレより: https://forums.swift.org/t/state-messing-with-initializer-flow/25276/3 Although that will compile, @State variables in SwiftUI should not be…(Continue Reading)

RxSwiftのObservableにDisposeBag処理を行うと、画面起動後の処理に反応しなくなる

投稿者: Anonymous RxSwiftを始めて間もないため、タイトルが変でしたらご了承ください。 RxSwiftのサンプルにある、Simple Validationを写経して学習していました。 https://qiita.com/kzykbys/items/3bbb4fa24d30917afd05#simple-validation その際、Observableにbind処理をし、その後disposedでDisposeBagを設定すると、textFieldに値を入れても、バリデーションの処理が行われません。 変わりにdisposedをコメントアウトすると、処理が動くようになりました。 RxSwiftのサンプルではdisposedを使っても動作していたため、理由がわからず困っています。 RxSwiftのバージョンは4.3.1です。 こちらの画面を初期画面として呼び出しています。 どうぞよろしくおねがいします。 import UIKit import RxSwift import RxCocoa fileprivate let minimalUsernameLength = 5 fileprivate let minimalPasswordLength = 5 class ValidationViewController: UIViewController { @IBOutlet weak var userNameTextField: UITextField! @IBOutlet weak var passwordTextField: UITextField! @IBOutlet weak var userNameDescriptionLabel: UILabel! @IBOutlet weak var passwordDescriptionLabel: UILabel! @IBOutlet weak var…(Continue Reading)

アプリの初回起動の限定の処理について

投稿者: Anonymous アプリをインストールした直後に一回だけ NavigationBar のタイトルを決める処理をしたいのですが書いたコードが実行されない理由はなんですか? 又、どの様にしたら実行される様になりますか? import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { static let share = AppDelegate() var window: UIWindow? var theFarstNameDidSet : ((_ nowNumber : String) -> Void)? = nil var theFarstBool = false func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { //ここが初回起動のコードらしい。 // Override point for customization after application…(Continue Reading)

SwiftUIのVStackの書式がよくわからない

投稿者: Anonymous SwiftとSwiftUIを学び始めたばかりの初心者です。VStackが構造体ということはわかりました。 VStackはあらかじめ定義されたものですが、チュートリアルにあるようなbodyの中にかくVStackはオーバーライドの記法なのでしょうか? ここの記法がどういうものなのかを教えていただけると幸いです。 ↓AppleのSwiftUIチュートリアルより引用 struct ContentView: View { var body: some View { VStack { Text(“Turtle Rock”) .font(.title) Text(“Joshua Tree National Park”) } } } 解決 SwiftUIについては、functionBuilderなんて、かなり大掛かりな言語機能自体の拡張が関わっているのですが、あなたが引用したような「チュートリアルにあるようなbodyの中にかくVStack」に関して言うと、旧来のSwiftにもあったイニシャライザ構文 と言うことになります。 (「構造体では継承やオーバライドはできない」と言う点について、Swift言語としての変更はありません。) VStackには、 init(alignment: HorizontalAlignment, spacing: CGFloat?, content: () -> Content) と言うイニシャライザがありますが、前2つの引数alignmentとspacingは省略可なので、クロージャ型であるcontent引数をtrailing closureの構文で呼び出している形になります。 その部分をtrailing closureを使わずに書く(ついでにreturnの省略もやめる)とこんな感じですね: struct ContentView: View { var body: some View { return VStack.init(content:…(Continue Reading)

音声即時再生のためのコード.prepareToPlay( )をコードに入れたところ、コンパイルエラーが出てしまいました。

投稿者: Anonymous 初めまして。 swiftを勉強し始めて1週間の初心者です。(プログラミングの経験もかなり浅いです。) 先ほど「世界一受けたいiPhoneアプリ開発の授業」という本を元にコードの写経をしていたところ、コンパイルエラーが出てしまいました。 1〜2時間ほど考えてみたり、コードを打ち直してみたり、Xcodeを再起動してみたり、色々試しましたがエラーは消えず…。という状態です。 エラーでは Value of Optional type “AVAudioPlayer” not unwrapped; did you mean to use “!”or”?”? エラーを治すための指示は Fix-It Insert “!” と書いてありますが、!を挿入してもエラーが出たままです。逆に?を挿入したらエラーは無くなるんですが、これってどういうことが原因なのでしょうか? コードは下記になります。(冒頭のcopyrightなどは省略させていただきます。**で囲まれたところにエラーが出ます。) import UIKit import AVFoundation //AVFoundationをインポートする class ViewController: UIViewController { var player:AVAudioPlayer? //音声を制御するための変数 //BGM再生メソッド func play(soundName:String){ //String型の引数からサウンドを読み込む let soundPath = NSBundle.mainBundle().bundlePath.stringByAppendingPathComponent(soundName) //読み込んだファイルにパスをつける let url:NSURL? = NSURL.fileURLWithPath(soundPath) //playerに読み込んだmp3ファイルへのパスを設定する player = AVAudioPlayer(contentsOfURL:…(Continue Reading)

Swift のライブラリ MessageKitについて

投稿者: Anonymous MessageKitのGitHubにあるソースコードで MessageInputBarDelegateプロトコル内に記述されている messagesCollectionView.insertSections([messageList.count – 1]) の意味がよく分かりません。 このコードでsendボタンを押すとメッサージが表示されるようになるのは分かるのですが、 [messageList.count-1]とは何を意味するのでしょうか。 extension ConversationViewController: MessageInputBarDelegate { func messageInputBar(_ inputBar: MessageInputBar, didPressSendButtonWith text: String) { // Each NSTextAttachment that contains an image will count as one empty character in the text: String for component in inputBar.inputTextView.components { if let image = component as? UIImage { let imageMessage =…(Continue Reading)

Swift 画面遷移しても継続してカウントダウンして欲しい。

投稿者: Anonymous UserDefaultを使ってみるも良く分からず。。。 import UIKit class NextViewController: UIViewController { var timer : Timer? var date1 : Date? var date2 : Date? var count = 15.0 @IBOutlet weak var countDownLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() } @IBAction func startButton(_ sender: UIButton) { date1 = Date() if timer?.isValid != true { timer = Timer.scheduledTimer(timeInterval: 1.0, target:…(Continue Reading)

Realmをデータソースにしてテーブルビューの並べ替えをしたい

投稿者: Anonymous RealmにてPrimaryキーを書き換えようとしています。 それによってTableViewの並べ替えをしたいと考えております。 しかし以下のコードではプライマリーキーのIDを書き換える時にエラーが出ます。 Terminating app due to uncaught exception ‘RLMException’, reason: ‘Primary key can’t be changed after an object is inserted.’ エラーメッセージと公式サイトの情報から推察すると、プライマリーキーは変更できないという理解でよろしいでしょうか? できないとすると、一般的には一度すべてのデータ(多くても数十件のデータを想定)を避難して、DBをすべて削除し採番し直して追加ということで対処するのがいいのでしょうか。 もしくは、テーブルに表示順を持たせて、それを書き換えるのがいいのでしょうか。 ご教授いただけないでしょうか。 よろしくお願いいたします。 ※以下のコードは、間違いがあるかもしれませんので、したいことを理解する目的で参考にしていただければと思います。 //メインデータ class mainDataTable: Object { dynamic var ID = Int() let Days = List<subDataTable>() //LinkingObjects(fromType: subDataTable.self, property: “Day”) // dynamic var CategoryNo = Int() override static…(Continue Reading)

`..

投稿者: Anonymous Swift2.2からSwift3に移行しており、NSMakeRangeを書き換える際にエラーが発生しました。 そのエラーは解消できているのですが、処理でどうしても腑に落ちない点があります。 Swift2.2 let data = “あいうえお”dataUsingEncoding(NSShiftJISStringEncoding) let subData = data?.subdataWithRange(NSMakeRange(0, 10)) Swift3 let data = “あいうえお”.data(using: String.Encoding.shiftJIS) // 10bytes let subData = data?.subdata(in: 0 ..< 10) この場合、NSMakeRange(0, 10)なので0 ..< 11にして、0〜10の範囲を取得できるだろうと思っていたらエラーが発生し、以下のログが出力されました。 Termination app due to uncaught exception NSRangeException, reason: -[_MSInlineData subdataWithRange:]: range {0, 11} exceeds data length 10 今までの記憶では 0 ..< 10 =>…(Continue Reading)

「URLから動画の取得が終了したら」という条件つきで実行したい処理

投稿者: Anonymous 「URLから動画の取得が終了したら」という条件つきで実行したい処理があります。 (動画の取得中には実行したくない) このような処理を実装する場合に、どのような方法が考えられますか。 以下のように非同期処理で実現しようとしたところ、クラッシュしました。 DispatchQueue.global().sync { let url = URL(string: “http://movie.mov”) let player = AVPlayer(url: url!) let playerViewController = AVPlayerViewController() playerViewController.player = player let playerLayer = AVPlayerLayer(player: videoPlayer) self.view.layer.addSublayer(playerLayer) player.play() DispatchQueue.main.sync {    //ここで処理を実行したい } } 解決 動画の取得を別スレッドで、UIの更新系の処理をmainスレッドで処理です。 syncやasyncの中に書かれた処理は普通に上から下に向けて処理されます。 下のようにすることで動画を取得してからデータ/UIの更新となります。 // ここは一般的には非同期 async で実行します // 同期的でよい場合はDispatchQueueを使う必要はありません。 DispatchQueue.global().async { //ここでURLから動画の取得 // ここはasyncでもsyncでもOK。 下に違いを記述。 DispatchQueue.main.sync { //…(Continue Reading)