Guild icon
swift-developers-japan
main / objc
Avatar
Swift Type Compatibility When you create a Swift class that descends from an Objective-C class, the class and its members—properties, methods, subscripts, and initializers—that are compatible with Objective-C are automatically available from Objective-C. This excludes Swift-only features, such as those listed here: Generics Tuples Enumerations defined in Swift without Int raw value type Structures defined in Swift Top-level functions defined in Swift Global variables defined in Swift Typealiases defined in Swift Swift-style variadics Nested types Curried functions
Avatar
かなしいなぁ
Avatar
ObjectiveC -> Swift が結構いけるんでいけるとおもってたけど、 Swift -> ObjecCはかなり制限ありますね
10:05 AM
特に、Structとか、メモリレイアウト的には素直だから、関数群として吐かれたりしてほしかった
Avatar
Xcode9 beta1,2,3 で、iPhoneSimulatorのみで発生する VM: libobjc.A.dylib __DATA がオブジェクトをキャプチャして離してくれないのでメモリリークする現象があって
8:37 AM
似たようなの遭遇したことある人居ますか?
8:37 AM
多分Simulatorのバグだとは思うけど
Avatar
Objective-C Playgroundsとか作ってる人いたのね。 https://github.com/krzysztofzablocki/Playgrounds
Playgrounds - Better playgrounds that work both for Objective-C and Swift
👍 1
12:23 AM
try! Swift is an immersive community gathering about Swift Language Best Practices, Application Development in Swift, Server-Side Swift, Open Source Swift, and the Swift Community taking place around the world in Tokyo, New York, and Bangalore.
Avatar
もともとObj-C側では @property NSString *Id の名前でプロパティーを定義していたところ、Swift化するにあたって名前を var id: String? に直したら、他のまだSwift化されてないObj-Cファイルからの呼び出しで .id でアクセスできます?それともSwift化するときに var Id: String? で宣言しないとダメです?
3:55 AM
ちなObj-Cのところの呼び出しのシンタックスハイライトがこうなっている
Avatar
ObjC側のアトリビュートとしてSwiftに見せる名前を定義する方法があった気がします その場合ObjC同士では特に変わらないかと
3:56 AM
それともObjCにおいて名前を id にしても大丈夫か?って話ですか?(予約語?だから
Avatar
そうですね、名前を id にしても大丈夫かですね
3:58 AM
もともとObj-Cで @property NSString *Id で定義したものをSwiftで呼び出すときは .id に直されてるからね…
Avatar
Kishikawa Katsumi 11/20/2017 3:58 AM
idは予約語じゃないです。プロパティ名にしても問題ありません。 (edited)
🙏 2
Avatar
でも逆にSwiftで var id で定義したものをObj-Cで .Id で呼び出せない、当然ですが (edited)
Avatar
Kishikawa Katsumi 11/20/2017 3:58 AM
シンタックスハイライトが気になるだけ。
🙏 1
Avatar
おおありがとうございます!!
Avatar
Kishikawa Katsumi 11/20/2017 4:02 AM
メソッドは@objc使って@objc([ALT_NAME]) って感じで別名つけられるように、プロパティも別名をつけられるんじゃないでしょうか。
🙇 1
Avatar
ふむふむ、試して見ます
4:08 AM
@objc(Id) var id: String? で無事ビルド通りました!ありがとうございます!!
Avatar
Kishikawa Katsumi 11/20/2017 4:08 AM
へえ〜
Avatar
ああ、そういうことか、実定義はObjCからSwiftに移すんですね。
4:09 AM
で、ObjC側には Id で見せるのか。
Avatar
ですです、負債と絶賛戦い中です
💪 2
Avatar
objcでは UIViewController<HogeProtocol> で表現できていた型をswiftにブリッジするとUIViewController & HogeProtocol ってなると思うんですけど、これswift3以前はどういう風にブリッジされてたんですかね
Avatar
当時その問題には気づいてたけどわざわざ調べなかったからわからない・・・
Avatar
「objcの話だったらディスコに書けばおもちメタルが教えてくれるっしょ」
8:26 AM
「omochimetaruが入力中」「おっ」みたいな感じでした
Avatar
当時Discordがあったら喜々として実験してそう
Avatar
& で型を複合するのって、プロトコル&プロトコルは前からできたけど型&プロトコルっていつからできたんだっけ
Avatar
3.2だと protocolの情報が消えた
Avatar
やろうとして出来ないからはーーーーってなった記憶はある
8:34 AM
逆にさっきひらりが出したコード、仮にConform出来たとしても動かないのではとずっと思っていた (edited)
Avatar
セルのやつ?
☝ 1
Avatar
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
Avatar
Source Compatibility のところに書いてありましたね。プロトコルが無視されてブリッジされてたと。
Avatar
objective-c - (NSObject *)something:(NSError **)error { return nil; }
12:18 PM
最近同僚が見つけたんですが、nullableではない任意のオブジェクトを、nilで返してNSErrorダブルポインタがあると、swift側では
12:19 PM
throws -> NSObjectに見えてるんですね、そしてswift内製のErrorがthrowされます
Avatar
NSErrorダブルポインタの自動throws化はSwift2からアッた気がする
Avatar
まじかー
12:20 PM
いやそれはそう
Avatar
ちなみにそこは NSError * __autoreleasing * が作法だったような
Avatar
じゃなくて、IUOじゃなくてthrowsに突っ込まれるのが面白いところ
Avatar
ん?
12:20 PM
Optionalじゃないのか。
Avatar
return nilが、throwsに化ける
Avatar
ああなるほど
12:21 PM
ObjCのError Conventionだと、「zero valueのときにerrorがある」だから
12:22 PM
それでいい気がする
12:22 PM
でもnilを返してるのにerrorをセットしないのはその規約に違反してるから
12:22 PM
Swift変換のところでどうなんだ。
Avatar
objcだと、値を返しつつErrorを付与も出来てたんですね
12:22 PM
そうそう、面白いのは
Avatar
それは、できるけど、やらないんじゃなかったかなあ
Avatar
Errorを作ってないのに、Errorが生成されるんす
Avatar
要するにAPIのセマンティクスとしては value + error の多値で返してるんだよね  GoLangと一緒
Avatar
swiftが無を取得してくれる
Avatar
12:23 PM
それNSErrorなの?
Avatar
えーと、
12:24 PM
何だったか覚えてないけど、_から始まる極めて怪しいErrorだった
Avatar
ウケる
Avatar
これ面白いのはnullableにするとError吐かなくなる(であろう)点と
Avatar
ObjCの明示的型指定?マジ?
Avatar
throws無しだとNSObject!になるはずなので
Avatar
nullableでも理屈は一緒な気がするけどなあ
Avatar
まだ試してないんだ
Avatar
なるほど
12:25 PM
試すのちょっとめんどいね
Avatar
でもthrowsつけるとIUO消滅するのは、面白ポイント高いよ
Avatar
iOSAppの砂場ならそんなでもないか、やってみる
Avatar
本来なら無指定はNSObject!
Avatar
ブリッジされたObjCってなんて名前でimportするんだっけw
Avatar
swiftブリッジングヘッダーみたいな奴つくる
Avatar
それは自動でできた
12:29 PM
Swift側からのimport文がわからない
Avatar
そこに#importかけば出てこなかったっけ
Avatar
何も書かなくてもいけたわw
Avatar
Avatar
これ、Bridingだとヘッダーが本物にジャンプしちゃって
12:33 PM
clang-importerの視界にならないな
12:34 PM
-(NSObject *)func1WithError:(NSError **)error; func func1() throws -> NSObject
12:34 PM
↑とりあえずこれは確認できた
12:34 PM
nilだけ返して実行してみよう。
12:36 PM
do { let a: AAA = AAA() let b: NSObject = try a.func1() } catch { print(error) print("--") print(type(of: error)) print("--") dump(error) }
12:36 PM
nilError -- _GenericObjCError -- - Foundation._GenericObjCError.nilError
12:37 PM
Foundation._GenericObjCError、気になるw
12:38 PM
-(NSObject * _Nullable)func1WithError:(NSError * _Nullable * _Nullable)error; これで全く同じだったよ
Avatar
まじかー
Avatar
逆にコンベンション違反なやつ試してみるか
Avatar
後throws無しだとNSObject!になるよね
Avatar
-(NSObject *)func2; -(NSObject * _Nullable)func3; -(NSObject * _Nonnull)func4;
12:49 PM
func func2() -> NSObject! func func3() -> NSObject? func func4() -> NSObject
12:50 PM
-(NSObject * _Nonnull)func5WithError:(NSError * _Nullable * _Nullable)error; func func5WithError(_ error: NSErrorPointer) -> NSObject
12:50 PM
typealias NSErrorPointer = AutoreleasingUnsafeMutablePointer<NSError?>?
12:50 PM
あれ、これ大丈夫か?AutoreleasingじゃないのにAutoreleasingにブリッジされとる
12:51 PM
いや、ダブルポインタが暗黙にAutoReleasingなのか。
12:53 PM
-(NSObject * _Nonnull)func6WithError:(NSError * __strong _Nullable * _Nullable)error; func func6WithError(_ error: UnsafeMutablePointer<NSError?>?) -> NSObject
1:01 PM
nullableとかの言及はないけど。
Avatar
NS_SWIFT_NOTHROW
こういうので制御もできるんですね。
Avatar
UIApplicationMainEXC_BREAKPOINT で落ちちゃうけど、普通ならZombie Object使うとかExceptionのブレーカーポイント置くとかで原因特定できるはずだけど、今回だけ何をやっても原因特定できない&iOS 14だけで発生するバグに直面している…もうお手上げ状態 😇 (edited)
2:30 AM
思いつく手を全部尽くした…
2:30 AM
2:30 AM
2:30 AM
Avatar
AVAudioPlayer?
Avatar
それっぽいけど落ちたときのコンソールのログはCFURLだよななぜか 🤔 それにAVAudioPlayerだけ言われても具体的にどこのAVAudioPlayerで落ちてるのかわかんない 😇
Avatar
毎回stacktraceが異なる?
Avatar
変わりはしないですが、問題はプログラムの中でAVAudioPlayer使ってるところが多くて把握しきれてないですよね、私が書いたプログラムじゃない上10年くらい前のコードベースですので 😇
Avatar
なるほど、、
2:52 AM
NSThreadPerformPerformsということは
2:52 AM
なんか生存期間が一致してないアクセスがある感じがする
2:52 AM
threading関係かなあ。
2:53 AM
10年前だとlibdispatchじゃないのかな...
Avatar
至る所に performSelectorOnMainThread ですね…
2:54 AM
多分だけどどこかのポインタに複数のスレッドから読み書きしてて
2:54 AM
iOS14でなんらかのタミングが変わったことで
2:54 AM
バグが顕在したみたいな感じじゃないかな〜
2:55 AM
Address sanitizer使ってみるといいかも
Avatar
ありがとうございます!やってみます 🙇
Avatar
ご健勝を...!
Avatar
何も変わりませんでした… orz
3:01 AM
結局はこうですね…
Avatar
thread sanitizerはどうかな
Avatar
それが何故か使えないですよね… 🤔
Avatar
組み合わせでダメならまだわかりますが…
Avatar
実機だと使えないなんてあったっんだっけなあ
Avatar
マジか…シミュレーターだと使えた
3:15 AM
ダメだ 😇 やっぱ全く同じです、何も変わりません🥴
3:16 AM
諦めて寝よう…
Avatar
あらま...
3:19 AM
地味にコード切り分けて
3:20 AM
探索するとかですかねえ...
Avatar
やるにしても夜の俺に任せることにしました…Obj-C詳しくない&MRCさらに詳しくないので 😇
3:23 AM
未来の自分に期待
Avatar
まあそもそも会社の業務じゃないしまだ見積もり段階だけなので最悪「すみませんできません」って返事するのも一つの手ではあったりw
3:25 AM
(流石に手動でalloc dealloc retain releaseするの無理だわ()
Avatar
たしかに厳しい
Avatar
昨日のそれ、まさかマジで特定なところで retain が抜けてたことによって発生した問題だったとは…w
Avatar
おー、ぽい。
Avatar
確か今までだとその問題はZombie Object有効にするとか、例外検査をThrow時にブレークするとかの手法で、手動 release 呼び出すときちゃんとその release で止まってたはずだけどな… 🤔 あとiOS 13だとこの現象が発生しないのも気になります…
Avatar
多分だけど、miultithreadが関係してそうだからじゃないですかね。
4:13 AM
pointer がイカれてる場合はそういうのではどうにもならない気がする。
4:13 AM
iOS 14で起こるようになった理由はわからないけれど...
Avatar
ふむふむ
Avatar
llvm 簡単 なおしかた の回答が必要
5:42 AM
Avatar
ここで良いかな? M1RACLES は悪用難しそうだし、うまく使ったら面白いことできそう、という印象です。 https://www.phoronix.com/scan.php?page=news_item&px=Apple-M1-M1RACLES
Avatar
Avatar
dictav
ここで良いかな? M1RACLES は悪用難しそうだし、うまく使ったら面白いことできそう、という印象です。 https://www.phoronix.com/scan.php?page=news_item&px=Apple-M1-M1RACLES
たぶん #apple-silicon ?
🙏 1
Avatar
こんばんは! 相談が欲しい! このコードについて https://pastebin.com/Mssvf16s swiftからobjectiveCをコンバートしたいんですが、あまり出来なくて Objective-Cの方はこちら↓ ボタンが見えませんです https://pastebin.com/EPUtsBsU viewDidLoad のコメントが見えますけど @property の方が全く見えませんです 何か足りないことや、間違ってることをしているのでしょうか
Avatar
Kishikawa Katsumi 3/2/2022 8:31 PM
Objective-Cは self.signInButton[self signInButton]; のシンタックスシュガーなので、 self.signInButton.frame = CGRectMake(20, self.view.frame.size.height - 50 - self.view.safeAreaInsets.bottom, self.view.frame.size.width * 0.9, 50); self.signInButton.layer.cornerRadius = self.signInButton.frame.size.height / 2; [self.signInButton addTarget:self action:@selector(handlePress:) forControlEvents:UIControlEventTouchUpInside]; ^ の行の self.signInButton は全部 [self signInButton]; となるので、毎回新しいボタンが生成されてそれに対して設定しているので、全部無駄になっています。 Swiftのコードと同等にするにはまずヘッダファイルにプロパティの定義がなければ次のように追加してください。 @interface WelcomeViewController () @property (nonatomic) UIButton *signInButton; @end 自動的に _signInButton という変数が追加されるので、 getterメソッドを次のように書き換えてください。 - (UIButton *)signInButton { if (!_signInButton) { UIButton *button = [[UIButton alloc] init]; button.backgroundColor = [UIColor systemRedColor]; button.layer.borderWidth = 2; button.clipsToBounds = YES; [button setTitle:@"Apple IDでログイン" forState:UIControlStateNormal]; [button setTitleColor:[UIColor systemBackgroundColor] forState:UIControlStateNormal]; _signInButton = button; } return _signInButton; }
happy 1
8:32 PM
全体のコードは次のようになります。 @interface WelcomeViewController : UIViewController @property (nonatomic) UIButton *signInButton; @end @implementation WelcomeViewController - (UIButton *)signInButton { if (!_signInButton) { UIButton *button = [[UIButton alloc] init]; button.backgroundColor = [UIColor systemRedColor]; button.layer.borderWidth = 2; button.clipsToBounds = YES; [button setTitle:@"Apple IDでログイン" forState:UIControlStateNormal]; [button setTitleColor:[UIColor systemBackgroundColor] forState:UIControlStateNormal]; _signInButton = button; } return _signInButton; } - (void)viewDidLoad { [super viewDidLoad]; self.title = @"タイトル"; self.view.backgroundColor = [UIColor systemGreenColor]; [self.view addSubview:self.signInButton]; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.signInButton.frame = CGRectMake(20, self.view.frame.size.height - 50 - self.view.safeAreaInsets.bottom, self.view.frame.size.width * 0.9, 50); self.signInButton.layer.cornerRadius = self.signInButton.frame.size.height / 2; [self.signInButton addTarget:self action:@selector(handlePress:) forControlEvents:UIControlEventTouchUpInside]; } - (void)handlePress: (UIButton *) sender { printf("Button pressed!"); } @end
yoshi 1
Avatar
なるほど! これがgetterという名前なんですね、知らなかった! 私はまだiOS developmentの初級者だから、まだまだ勉強が必要ですね。 じゃあ、例えばint property numberを作成する場合 そのgetter/setterの中は新しいvariable _number が使うことができますね // header @property int number; // objc file - (int)number { return _number; } // これがgetter - (void)numberSetter:(int)newNumber { _number = newNumber; } // これがsetter ということなんですね めっちゃわかりやすく説明をしてくれてありがとうございます!
Avatar
Kishikawa Katsumi 3/2/2022 11:05 PM
正確には、 int n = self.number; <= は - (int)number { return _number; } ですが、setterの self.number = 100;- setNumber:(int)newNumber { _number = newNumber; } と、 setXxx という規則になります。 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html ^ たぶんOfficialのDocumentはこれだと思います。(もっと新しいのがあるかも)
Describes elements of best practice when writing code with Objective-C using ARC.
Avatar
@optional なメソッドがある Objective-C のプロトコルにコンフォームした Objective-C のクラスを Swift で extend した場合、その @optional なメソッドが?で呼べない... (edited)
4:43 AM
@protocol P <NSObject> @optional - (void)optionalMethod; @end @interface C : NSObject <P> @end class S: C { override func optionalMethod() { super.optionalMethod?() // できない } } (edited)
4:43 AM
これってこういうものでしたっけか...
Avatar
Kishikawa Katsumi 8/26/2022 4:50 AM
class S: Cのメソッドをtypoしてますけど直しても変わりませんか?
Avatar
あー、これは概要で...
4:51 AM
今ここで書いたので。
4:51 AM
本当は @implementation とかいる
4:51 AM
あとファイルがいっぱい
4:51 AM
あと-Swift.hと...
Avatar
Kishikawa Katsumi 8/26/2022 4:51 AM
なるほど。そんな簡単なことじゃないか。。。
Avatar
これなんか解決できない気がするんですよ
4:52 AM
superをPとして認識させないといけない
4:52 AM
superのままだと?をつけさせてくれない
Avatar
override特有の問題っぽいですね
Avatar
objcのruntime使うしかないか...
4:54 AM
いやでもsuperできるのか...
Avatar
Kishikawa Katsumi 8/26/2022 4:56 AM
確かに?つけられないですね。そして呼んだら当然メソッドがないからランタイムにクラッシュ。
Avatar
super.responds(to: #selector()で守るしかないかも
4:56 AM
そうです
4:57 AM
crashするコードをコンパイラが強制してくる
Avatar
Cをswift側に実装したら上手くいきます?
Avatar
おー、試してないですね
Avatar
こういうのは書けないですか? func takeP<X: P>(_ x: X) { x.optionalMethod?() } takeP(self)
Avatar
Method does not override any method from its superclassといわれた
4:59 AM
@objc protocol P { @objc optional func optionalMethod() } class C: P { } class C2: C { override func optionalMethod() { super.optionalMethod?() } }
Avatar
正しそう
Avatar
@Yuta Saito おー、どうかな
Avatar
本当はこれを想定しているが、そのエラーが出せなくなってることが問題な気がしますね
Avatar
あー、そうかsuperに実装の実態がないのかぁ
Avatar
あー、superをtakePには渡せない
5:02 AM
いやでも、superはobjcだからあるかどうかruntimeまでわからない...
5:03 AM
あるかもしれないけど。
5:03 AM
時の運
Avatar
実行時までわからないなら保守的にエラーになってほしいな
Avatar
overrideできるのはいいけど?つけてさせてほしい
Avatar
ちなみに super.responds(to: #selector() で想定通り動きますか?
Avatar
試し中...
5:05 AM
Argument of '#selector' does not refer to an '@objc' method, property, or initializer え...
5:06 AM
あー、()いらないのか。 (edited)
5:07 AM
動いたっぽいですね crashした... (edited)
Avatar
Kishikawa Katsumi 8/26/2022 5:08 AM
super.responds(to: #selector()) がtrueを返してる気がする
Avatar
そうなんすよ
5:08 AM
どういうこっちゃ
Avatar
明らかに壊れてるなぁ
Avatar
こわい...
5:10 AM
runtime apiつかうかあ
Avatar
Kishikawa Katsumi 8/26/2022 5:10 AM
respondsToはオーバーライドでselfがtrueを返してるんじゃないだろうか。
Avatar
そんな感じですねー。 (edited)
Avatar
Kishikawa Katsumi 8/26/2022 5:10 AM
なんかスーパークラスのrespondsToがあったような
Avatar
Kishikawa Katsumi 8/26/2022 5:11 AM
それですね。 [[self superclass] instancesRespondsToSelector これ使えるのかな。
Avatar
初めて見たかもw
5:14 AM
んー、でもこれ、superclassのsuperclassが持ってる時はtrueにならない気がする
Avatar
Kishikawa Katsumi 8/26/2022 5:14 AM
それはスーパークラスがなくなるまで遡って全部判定するしかないかも。。
Avatar
ひえ〜
Avatar
これ普通にUIKitのDelegate使ってるだけで死ぬ可能性あるって事ですよね
5:17 AM
今まで見つからなかったんだな
Avatar
ですね〜
5:17 AM
前はよかったとか?
Avatar
Take this UITableViewController subclass: final class MyTableViewController: UITableViewController { override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { super.tableView(tableView, willDisplay: cell, forRowAt: in...
8:38 PM
UIKitで困ってる人いた
Avatar
@protocol P <NSObject> @optional - (void)optionalMethod; @end @interface C : NSObject <P> @end import MyFW C().optionalMethod?() // コンパイル通らない C().optionalMethod() // 実行時エラー なので、overrideの問題というよりは、やっぱり super を P として解釈する手段がない問題の気がする (edited)
Avatar
superが必要になる場合はほとんどoverrideのケースなので、、同じではないけれど現実的な問題としてoverrideで大変になるってことかな
Avatar
こんにちは☺️ SwiftとObjective-Cのinteroperabilityについて調べていて、特に、SwiftからObjCのメソッドを呼び出すときに裏側で何が起こっているのかが知りたいのですが、オススメのドキュメントや書籍などはありますでしょうか? 逆方向であるObjCからSwiftの関数呼び出しは、SwiftのコードからObjCのソースコードが生成されているという理解なのですが、これは正しいですか?
Avatar
Swift -> ObjC はABIに基づいて呼び出してます ABIというのは関数呼び出しの時のメモリやレジスタの使い方の事です ObjC -> Swift は呼び出すためにヘッダーは生成されているのでObjC側からはObjCに見えてますが、ソース(実装)は生成しないです。 SwiftのクラスがObjCのクラスとして呼べるようなメモリレイアウトで生成されてます。 まあこれもABIを合わせてるといえます。 書籍はわからないです。 ドキュメントはコンパイラリポジトリのものとかがあります。
C and ObjC interoperability:
https://github.com/apple/swift/tree/main/docs
The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub.
Avatar
Objective-C はまず C なので、C の学習がないのなら、Cの学習が必要だと思います。
2:10 PM
その上で、Objective-C のランタイム(objc_msgSendとか)とかのObjective-C独自の機能の実装を知ると良いと思います。これは Apple のドキュメントが良いです。あとソースコードが公開されています。
2:11 PM
Objective-C は Ruby などと似た実装なので、Ruby の実装にも興味を持たれると楽しいかもしれません。
2:11 PM
その上で Swift がなにをどうしてるのか調べると完璧かと思います。
Avatar
なるほど、SwiftとObjCはABIがcompatibleなんですね。もっと高レイヤーで何かしているかと思っていたのですが、バイナリレベルだったとは驚きです。
5:57 PM
リンクやアドバイスもありがとうございます。 Appleのドキュメントと実装を探ってみることにします
Exported 233 message(s)
Timezone: UTC+0