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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

2646閲覧

スタティック・コンストラクタ(引数付き)に変換される場合の対処法

hiroH

総合スコア7

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

1グッド

0クリップ

投稿2016/10/24 15:59

編集2016/11/01 11:55

###前提・実現したいこと
現在、Objective-Cライブラリを利用するための、Xamarin.iOSのバインディングライブラリを作成しています。
引数付きのiOSクラスのイニシャライザを変換しビルドすると、以下のエラーメッセージで移植できないクラスがあります。
対処方法を調べているのですが解決できず、こちらに質問させて頂きました。

###発生している問題・エラーメッセージ
以下の3つのエラーメッセージが出ます

Error CS0132: `NameSpace.NSDateComponents_SomeClass.NSDateComponents_SomeClass(this NSDateComponents, global::System.nint, global::System.nint, global::System.nint, global::System.nint, global::System.nint, global::System.nint)': The static constructor must be parameterless (CS0132) 省略 : static constructor cannot have an access modifier (CS0515) 省略 : static constructor cannot have an explicit `this' or `base' constructor call (CS0514)

###変換元 Objective-C ソースコード
NSDateComponents+SomeClass.h

@interface NSDateComponents (SomeClass) - (instancetype)initWithYear:(NSInteger)year month:(NSInteger)month day:(NSInteger)day hour:(NSInteger)hour minute:(NSInteger)minute second:(NSInteger)second;

###変換後 ソースコード
ApiDefinitions.cs

[Category] [BaseType (typeof(NSDateComponents))] interface NSDateComponents_SomeClass { [Export ("initWithYear:month:day:hour:minute:second:")] IntPtr Constructor (nint year, nint month, nint day, nint hour, nint minute, nint second);

###試したこと
対処方法の調査と、Extra.csで対応を検討しましたが解決していません。

###補足情報(言語/FW/ツール等のバージョンなど)
・Objective Sharpie 3.3.0
・Xamarin Studio 6.1.1
・iOS SDK 9.3
・Binding Native Frameworks

amay077👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

[Category] で増やしたメソッドは C# でも拡張メソッドとして定義されますので、static になります。
C# ではコンストラクタを拡張メソッドで増やすことはできないため、エラーとなります。

いずれも回避策になってしまいますが、以下の中に打てそうな手はありますでしょうか。

  • このメソッドを Xamarin 側から呼ぶ予定がないのであれば、定義自体を消してしまう。
  • 目的とするクラスが NSDateFormatter ではなく同じライブラリに含まれており、別の箇所にカテゴリではない通常の定義があれば、そちらに [Category] に生成された Constructor の定義を移動させる。
  • ライブラリのソースにアクセスできるのであれば + (NSDateFormatter *) dateFormatterWith ... というクラスメソッドに追加してラップ、もしくは変更する。
  • ライブラリのソースにアクセスできないのであれば、問題のメソッドを使ってインスタンスを作って返すライブラリを自作し、バインディングする。

※ビルド時に obj/(Debug|Release) に作られる ios ディレクトリ以下に g.cs が作られるので、それを見ると理解が進むと思います。

投稿2016/10/25 04:46

編集2016/10/25 06:15
iseebi

総合スコア96

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

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

hiroH

2016/10/25 14:21 編集

ご回答ありがとうございます! 定義を削除で解決しました。 Xamarin側に公開するものだけあればよいのですね。 今回はライブラリ側を変更できない制約でしたが、 「問題のメソッドを使ってインスタンスを作って返すライブラリ」を含め、 教えて頂きました対策それぞれ確認しておきたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問