Previous << Enumerations
Next >> References
インタフェースの型は型のアノテーション内で直接使用できない為、代わりにIntersection Type(以下、インターセクション型と記す)の一部として使用する必要があります。 インターセクション型は、Intersection内部にリストされたすべてのインタフェースに適合した一つの値を表します。
インターセクション型の構文は{U1, U2, ... Un}
であり、ここで型U1
からUn
は、インタフェースに適合することになる型です。
インターフェースのフィールド、関数、そのセットが利用できます。
インターセクション型は、さまざまな異なる入力値で動作する関数を記述する際に便利です。例えば、引数の型にインターセクション型を使用することで、その関数はIntersection内の全ての、インタフェースを実装した値にアクセスすることができます。値はIntersection内部の機能に制限されます。関数が誤って他の機能にアクセスしようとした場合、静的チェッカーによってブロックされます。
access(all)
struct interface HasID {
access(all)
let id: String
}
access(all)
struct A: HasID {
access(all)
let id: String
init(id: String) {
self.id = id
}
}
access(all)
struct B: HasID {
access(all)
let id: String
init(id: String) {
self.id = id
}
}
/* Create two instances, one of type `A`, and one of type `B`.
* Both types conform to interface `HasID`, so the structs can be assigned
* to variables with type `{HasID}`: Some resource type which only allows
* access to the functionality of resource interface `HasID` */
let hasID1: {HasID} = A(id: "1")
let hasID2: {HasID} = B(id: "2")
/* Declare a function named `getID` which has one parameter with type `{HasID}`.
* The type `{HasID}` is a short-hand for `AnyStruct{HasID}`:
* Some structure which only allows access to the functionality of interface `HasID`.
*/
access(all)
fun getID(_ value: {HasID}): String {
return value.id
}
let id1 = getID(hasID1)
/* `id1` is "1" */
let id2 = getID(hasID2)
/* `id2` is "2" */
インタフェースが2つ以上存在する場合は、その型を実装した値(補足: リソースまたはStruct)はその両方を実装する必要があります。
access(all)
struct interface HasMetadata {
access(all)
var metadata: AnyStruct
}
access(all)
struct C: HasID, HasMetadata {
access(all)
let id: String
access(all)
var metadata: AnyStruct
init(id: String) {
self.id = id
self.metadata = []
}
access(all)
fun setMetadata(_ data: AnyStruct) {
self.metadata = data
}
}
/* valid, because `C` implements both `HasID` and `HasMetadata`. */
let hasID3: {HasID, HasMetadata} = C(id: "3")
/* Invalid, because `A` implements only `HasID`. */
let hasID4: {HasID, HasMetadata} = A(id: "4")
翻訳元
Flow BlockchainのCadence version1.0ドキュメント (Intersection Types)