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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

0回答

2111閲覧

SwiftのExtension内にネストされたenumのfuncを呼び出すとビルドエラー

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2016/11/24 08:15

編集2016/11/25 07:11

###ビルドエラーで困っています
UIViewのextension内でネストされたenum(Visibility等)を宣言し
そのenumのfuncを宣言し、宣言したfuncを呼び出そうとしたら、下記のエラーでビルドできずに困っています
extensionがモジュールだとこの問題が起きるのかもしれないです。
extensionの宣言自体をPodではなく
例えばViewControllerのファイルに書くと、動きます。

Undefined symbols for architecture i386: "type metadata for (extension in UIViewVisibility):__ObjC.UIView.Visibility", referenced from: UIViewVisibility_Example.ViewController.pickerView (__ObjC.UIPickerView, numberOfRowsInComponent : Swift.Int) -> Swift.Int in ViewController.o UIViewVisibility_Example.ViewController.pickerView (__ObjC.UIPickerView, titleForRow : Swift.Int, forComponent : Swift.Int) -> Swift.String? in ViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation)

プロジェクトはコレです。
https://github.com/MotokiMiyagi/UIViewVisibility/issues/2

Swift

1// a.enumsを呼び出すとビルドエラーになる 2UIView.Visibility.enums 3 4// b.これは大丈夫みたいです 5let visibility = UIView.Visibility.Visible 6let str = visibility.stringValue() 7 8// a, b の違いは staticかどうか? 9 10// エラーは起きない 11UIView.Visibility.staticFunc1() 12let enums = UIView.Visibility.staticFunc2() 13// return enums.count 14 15// エラー 返ってきた enumsのメソッドを使おうとすると駄目 16UIView.Visibility.staticFunc1() 17let enums = UIView.Visibility.staticFunc2() 18return enums.count 19

Swift

1public extension UIView { 2 enum Visibility: Equatable { 3 case Visible 4 case Invisible 5 case Gone(Direction, to:Stick) 6 7 public static func staticFunc1() { 8 } 9 10 public static func staticFunc2() -> [Visibility] { 11 var enums: [Visibility] = [ 12 .Visible, 13 .Invisible, 14 ] 15 16 for direction in Direction.enums { 17 for stick in Stick.enums { 18 enums.append(.Gone(direction, to: stick)) 19 } 20 } 21 22 return enums 23 } 24 25 public static var enums: [Visibility] { 26 get { 27 var enums: [Visibility] = [ 28 .Visible, 29 .Invisible, 30 ] 31 32 for direction in Direction.enums { 33 for stick in Stick.enums { 34 enums.append(.Gone(direction, to: stick)) 35 } 36 } 37 38 return enums 39 } 40 } 41 42 public func stringValue() -> String { 43 switch self { 44 case .Visible: 45 return "Visible" 46 case .Invisible: 47 return "Invisible" 48 case .Gone(let direction, let stick): 49 return "Gone(\(direction.stringValue()), \(stick.stringValue()))" 50 } 51 } 52 } 53}

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

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

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

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

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

fromageblanc

2016/11/25 04:21

クリーンしてもダメでしょうか?ViewController.oが再作成されれば解消するような気も。
退会済みユーザー

退会済みユーザー

2016/11/25 04:32

クリーンや、DerivedData内の削除も試しましたが、駄目でした...。Xcode7.3.1, Xcode8系でも試しましたが、同じエラーが出てしまいます
fromageblanc

2016/11/25 05:03

試してなければ、Build Settings -> Optimization LevelをNoneにしてみては?
退会済みユーザー

退会済みユーザー

2016/11/25 05:09

ありがとうございます、「Optimization LevelをNone」も試してみましたが、結果同じでした..。コンパイラのバグなのでしょうか?
fromageblanc

2016/11/25 05:38

enumの前に、「@objc」付けるとどうなります?
退会済みユーザー

退会済みユーザー

2016/11/25 05:47

"@objc"を付けてみましたが、「'@objc' enum must declare an integer raw type」と怒られてしまいます
退会済みユーザー

退会済みユーザー

2016/11/25 06:01

objective-cのコードは含んでいないのですが、その場合も関係があるものなのでしょうか。
fuzzball

2016/11/25 06:26

UIViewVisibility_Exampleで良いのでしょうか?Build Active Architecture Only をNOにすると質問のエラーは無くなるようですが。(ただし別のエラーが)
退会済みユーザー

退会済みユーザー

2016/11/25 06:30

UIViewVisibility_Exampleで当たっています。
退会済みユーザー

退会済みユーザー

2016/11/25 06:32

Build Active Architecture OnlyをNOにしてみましたが、これは、Extension自体が無効(?)になっているんですかね。。
fromageblanc

2016/11/25 07:00

extension UIView { enum enumTest:String { case One = "one" case Two = "two" public static var enums:[enumTest] { get { var enums:[enumTest] = [ .One, .Two ] return enums } } } }で、試してみましたが、UIView.enumTest.enumsでちゃんとアクセスできました。
退会済みユーザー

退会済みユーザー

2016/11/25 07:09

let enums = UIView.enumTest.enums では動きますが、そのあとprint(enums)でエラーがおきます
fromageblanc

2016/11/25 07:13

自分のところはそのコード、ダイジョブでした。環境依存ですかね。
退会済みユーザー

退会済みユーザー

2016/11/25 07:18

こちらはXcode7.3.1, swift2.2 です。先程わかったのですが、extensionはモジュールとしてimportしているのですが、宣言自体を、プロジェクトスコープ(?)のViewControllerなどのファイルに書くと問題なくビルドが通ります。
fromageblanc

2016/11/25 07:43

とりあえずビルドする術は見つかったんですね。よかったです。
退会済みユーザー

退会済みユーザー

2016/11/25 08:46

すみません... Podspecとして公開したいので、まだ解決にはならないのです...。つまりextensionをモジュールにしてビルドする方法が見つかっていません。Xcode8, swift3でそちらではできているみたいなので、試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問