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

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

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

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

275閲覧

swift4 #selectorを使い @objc func で警告滅セージが表示されます。

29507-01

総合スコア46

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/09/02 01:10

編集2018/09/04 04:08

前提・実現したいこと

selectorを使っているのですが相手が`objcになっている為、警告エラーが表示されます。
その為かわからないのですが以降の処理が上手くいってないような気がするので
警告エラーをなくしたいのですが記述がわかりません。
教えていただけないでしょうか?

swift4を使っています。
'''
import UIKit
import SpriteKit

class GameViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

// Configure the view. let skView = self.view as! SKView skView.showsFPS = true skView.showsNodeCount = true /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true // Create and configure the scene. let scene = GameScene(size: skView.frame.size) skView.presentScene(scene) // Pause the view (and thus the game) when the app is interrupted or backgrounded NotificationCenter.default.addObserver(self, selector: #selector(GameViewController.handleApplicationWillResignActive(_:)), name: NSNotification.Name.UIApplicationWillResignActive, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(GameViewController.handleApplicationDidBecomeActive(_:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)

}

override var prefersStatusBarHidden: Bool {
return true
}

override var shouldAutorotate: Bool {
return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.portrait
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}

@objc func handleApplicationWillResignActive (_ note: Notification) {
let skView = self.view as! SKView
skView.isPaused = true
}

@objc func handleApplicationDidBecomeActive (_ note: Notification) {
let skView = self.view as! SKView
skView.isPaused = false
}

}
'''

警告エラー
The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "SKtest" target.

@objcはswift4では警告になるのはわかっているのですが、その為には記述を変えるしかなくその方法がわからないのです。
'Swift 4で@objcに関するwarningが出たときの対処' というnetも見ていたのですが、
ベストな方法としては@objc を書き換える方法がベストだと思っていました。
質問の丸投げだと言われればどうしようもないですが ...

上記警告文では
build setting to "Default" for the "SKtest" target.
"Default"にしろとあるようなのですが、現在"Default"になっています。

On Swift3での@objc推論を有効にする(非推奨)...onにするのは非推奨となっているようです。

@objcはswift4では使えないと思っていました。
勘違いですか。

私のpcでは警告文に
build setting to "Default" for the "SKtest" target.
"Default"にしろとあるようなのですが、現在"Default"になっていて変えようが
ありません。

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

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

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

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

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

fuzzball

2018/09/03 00:33 編集

エラーメッセージを書いて下さい。あと、コードは ``` で囲って下さい。
fuzzball

2018/09/04 00:37 編集

とりあえず私の環境では警告は出ません。「@objcはswift4では警告になるのはわかっているのですが」というのも何か誤解しているように思います。あと、コードは ``` で囲って下さい。
guest

回答2

0

ベストアンサー

@objcはswift4では警告になるのはわかっているのですが、その為には記述を変えるしかなくその方法がわからないのです。

完全に勘違いしています。

「The use of Swift 3 @objc inference in Swift 4 mode is deprecated.」は、「Swift3の@objc推論機能の使用はSwift4モードで非推奨になりました。」と言っています。

@objcを使うことが非推奨になったのではなく、@objc推論機能を使うことが非推奨になったということです。@objc推論機能とは、「@objc」と書かなくてもSwiftが勝手に@objcがつけられたとみなして動作する機能です。

つまり、今まで(Swift3まで)は、「@objc」と書かなくてもエラーにならなかったところが、Swift4では「@objc」と書かないといけない場面が出てくるということです。

そして、今表示されている警告は、コードに対する警告ではなく、Build Settingsに対する警告です。この警告は、Build Settingsの「Swift 3 @objc Inference」を「On」に設定した時に表示され、「Default」または「Off」に設定した時に表示されなくなります。

「Swift 3 @objc Inference」を「Default」にして、質問に書かれているコードをビルドしたなら、fuzzballさんも試されている通り、この警告は出ないはずです。私も試してみたところ、警告は出ませんでした。

この設定を「Default」にした後、再ビルドしましたか?

後、念のため伝えておくと「以降の処理が上手くいってない」というのは、この警告とは関係ないです。この警告が出ることによるアプリへの影響は、@objcが付与された処理が無駄なところで行われる可能性があるというだけです。

上手くいかない部分については、別の原因を探ることをお勧めします。

投稿2018/09/04 04:26

編集2018/09/04 04:32
TakeOne

総合スコア6299

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

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

29507-01

2018/09/04 04:46

この設定は最初から「Default」で、何回もビルドしています。
fuzzball

2018/09/04 04:55

PROJECTではなくTARGETの設定を変更していますか?
29507-01

2018/09/04 05:00

TARGETの方が "ON" のままでした。二箇所にあるとは思っていませんでした。 さすがに初心者です。 しかしまた勉強になりました。 有難うございました。
29507-01

2018/09/04 05:04

すみません。 ベストアンサーのボタンを間違えたようです。
29507-01

2018/09/04 05:07

fuzzballさんをベストアンサーにするにはどうしたら良いのですか ?
fuzzball

2018/09/04 05:27

私は回答をしていないのでベストアンサーには出来ませんし、 TakeOneさんの回答がベストアンサーで問題ないと思います。
29507-01

2018/09/04 05:53

すみませんでした。 teratailの使い方もまだまだなもので、訂正できました。
guest

0

警告文言を知りたいところですが、とりあえず解決できそうなネタを貼り付けます。

投稿2018/09/03 16:39

nakasho_dev

総合スコア2655

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問