2017-06-30 17 views
3

私はいくつか簡単にstructsをswift内の.swiftファイルに書いています。 これらstructsは非常にシンプルで、ほぼ唯一の文字列が含まれています。クラスを作成せずにObjective-CでSwift構造体を使用する方法はありますか?

struct Letter { 
    struct A { 
     static let aSome : String = "descASome" 
     static let aSomeMore : String = "descASomeMore" 
    } 
    struct B { 
     static let bNow : String = "descBNow" 
     static let bLater : String = "descBLater" 
    } 
... 
} 

私は、クロスプラットフォームのフレームワークを書いているので、Objective-Cのコードを含むプロジェクト内のこれらの構造体を使用します。

私は読んでいます:ObjectiveC - Swift interoperability by Appleスウィフト書かれた構造体がObjectiveCで使用できないことを明確に述べています。除外 は、(他の機能の中)である:スイフト

で定義

構造

解決策1:

I、クラスを使用して問題を解決SO溶液を見出しました

@objc class Letter : NSObject { 
    @objc class A : NSObject { 
     static let aSome : String = "descASome" 
     static let aSomeMore : String = "descASomeMore" 
    } 
    @objc class B : NSObject { 
     static let bNow : String = "descBNow" 
     static let bLater : String = "descBLater" 
    } 
... 
} 

このソリューションは機能しますが、すべての構造体tクラス。構造体のような軽量ではありません(他のものの中でも)。 さらに、私は問題を解決するために後方に行くように感じる。

Q1。プロジェクト/状況に適していないソリューション1の横にObjectiveCの中にSwift構造体を使用する方法はありますか? (rawValueがIntの場合は列挙型を使用できます)

Q2。あなたは、いくつかの書き換えを行わず、これを行うことはできません

#if macOS // if Swift? 
#endif 
+1

Q1はhttps://stackoverflow.com/questions/26173234/how-to-use-swift-struct-in-objective-cの複製です。 Swift構造体がObjective-Cにインポートされないことが*文書化されています。 –

+0

私は質問を編集することができましたが、答えは "現在のところ"でした - 2014 ...ソリューションは私の場合(大アプリ)にはあまり良くありません。 – Darkwonder

+0

* "Swift構造体をObjectiveCで使用できない"と知っていたら*なぜ "ObjectiveC内部でSwift構造体を使用する方法はありますか?" * –

答えて

1

:ようスウィフトアクセスするための#define ObjectiveCアクセスのためのSomeConstとstuctsを使用する方法はありますスウィフト構造体は、単純にObjCからは見えません。

Swift Foundationの「オーバーレイ」タイプの逆の値を公開するには、ObjCが表示するSwiftクラスを記述する必要があります。

1つのオプションは、スウィフトコードの構造に可能な限り近づけることです。ネストされたクラスは許可されておらず、ObjCの "overlay"はSwift構造体とは異なる名前でなければならないことに注意してください。これは残念ですが、このSwiftコードは元の構造体と同じ場所に表示されるため、回避することは不可能です。

輸入財団

@objc class OCLetters : NSObject { 
    static let A = _A.self 
    static let B = _B.self 
} 

@objc class _A : NSObject { 
    static let some = Letters.A.some 
    static let someMore = Letters.A.someMore 
} 

@objc class _B : NSObject { 
    static let now = Letters.B.now 
    static let later = Letters.B.later 
} 

あなたにObjCコードの値のためにドット表記を使用する場合は、しかし、これは動作しません。これはおそらくバグですが、OCLetters.A.some.someは構造体メンバ参照として扱われ、失敗します。 (プロパティを計算されたクラスプロパティに変更しても機能しません)[[OCLetters A] some](または[OCLetters.A some])と記述する必要があります。

import Foundation 

@objc class OCLetters : NSObject { 
    static let A = _A() 
    static let B = _B() 
} 

@objc class _A : NSObject { 
    let some = Letters.A.some 
    let someMore = Letters.A.someMore 
} 

@objc class _B : NSObject { 
    let now = Letters.B.now 
    let later = Letters.B.later 
} 

はまた、あなたが、残念ながらのにObjCでの視認性を制限することはできませんのでご注意:

は、ドット表記を使用できるようにする性質が実際の事例になるように、あなたは少しの構造を変更する必要がありますヘルパー_A_Bクラスは、表示されない場合、OCLettersのプロパティは表示されません。

関連する問題