###ビルドエラーで困っています
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}
クリーンしてもダメでしょうか?ViewController.oが再作成されれば解消するような気も。
クリーンや、DerivedData内の削除も試しましたが、駄目でした...。Xcode7.3.1, Xcode8系でも試しましたが、同じエラーが出てしまいます
試してなければ、Build Settings -> Optimization LevelをNoneにしてみては?
ありがとうございます、「Optimization LevelをNone」も試してみましたが、結果同じでした..。コンパイラのバグなのでしょうか?
enumの前に、「@objc」付けるとどうなります?
"@objc"を付けてみましたが、「'@objc' enum must declare an integer raw type」と怒られてしまいます
http://blog.kitoko552.com/entry/20160107/1452169661 もしかしてこの辺の話ではないでしょうかね。
objective-cのコードは含んでいないのですが、その場合も関係があるものなのでしょうか。
UIViewVisibility_Exampleで良いのでしょうか?Build Active Architecture Only をNOにすると質問のエラーは無くなるようですが。(ただし別のエラーが)
UIViewVisibility_Exampleで当たっています。
Build Active Architecture OnlyをNOにしてみましたが、これは、Extension自体が無効(?)になっているんですかね。。
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でちゃんとアクセスできました。
let enums = UIView.enumTest.enums では動きますが、そのあとprint(enums)でエラーがおきます
自分のところはそのコード、ダイジョブでした。環境依存ですかね。
Xcode8.0 / swift 3.0です
こちらはXcode7.3.1, swift2.2 です。先程わかったのですが、extensionはモジュールとしてimportしているのですが、宣言自体を、プロジェクトスコープ(?)のViewControllerなどのファイルに書くと問題なくビルドが通ります。
とりあえずビルドする術は見つかったんですね。よかったです。
すみません... Podspecとして公開したいので、まだ解決にはならないのです...。つまりextensionをモジュールにしてビルドする方法が見つかっていません。Xcode8, swift3でそちらではできているみたいなので、試してみようと思います。
あなたの回答
tips
プレビュー