Swift 5.3 日本語化計画 : Swift 5.3


属性


Swift には、宣言に適用される属性と型に適用される属性の 2 種類の属性があります。属性は、宣言または型に関する追加情報を提供します。たとえば、関数宣言の discardableResult 属性は、関数が値を返すにもかかわらず、戻り値が使用されていない場合にコンパイラが警告を生成するべきではないことを示します。


属性の名前と、属性が受け入れるすべての引数が続く @ 記号を書くことで属性を指定します。


@
@ ( )


いくつかの宣言属性は、属性と、それが特定の宣言にいかに適用するかに関する詳細な情報を指定する引数を受け入れます。これらの 属性の引数 は括弧で囲まれており、その形式は、所属する属性によって定義されます。



宣言の属性


宣言にだけ宣言の属性を適用できます。


available

アスタリスク(*) を使用して、上にリストしたすべてのプラットフォーム名上の宣言が使用可能であることを示すこともできます。Swift のバージョン番号を使用して利用可能性を指定する available 属性は、アスタリスクを使用できません。


残りの引数は、任意の順序で表示でき、重要なマイルストーンを含む宣言の寿命に関する追加情報を指定できます。


異なるプラットフォーム上および Swift の異なるバージョンで宣言の利用可能性を指定するために、一つの宣言上で複数の available 属性を適用できます。available 属性が適用される宣言は、属性が現在のターゲットと一致しないプラットフォームまたは言語のバージョンを指定する場合は無視されます。available 属性を複数使用する場合、有効な利用可能性はプラットフォームと Swift の利用可能性の組み合わせです。


available 属性が、プラットフォーム名または言語名の引数に加えて introduced 引数だけを指定している場合は、以下の省略構文を代わりに使用できます。


@available( , *)
@available(swift )


available 属性の省略構文により、複数のプラットフォームの利用可能性を簡潔に表現できます。2つの形式は機能的に同等ですが、可能であれば省略形式が常に好まれます。


  1. @available(iOS 10.0, macOS 10.12, *)
  2. class MyClass {
  3. // class definition
  4. }


Swift のバージョン番号を使用して利用可能性を指定する available 属性では、宣言のプラットフォームの利用可能性を追加で指定することはできません。代わりに、Swift バージョンの利用可能性と 1 つ以上のプラットフォームの利用可能性を指定するために、別の available 属性を使用してください。


  1. @available(swift 3.0.2)
  2. @available(macOS 10.12, *)
  3. struct MyStruct {
  4. // struct definition
  5. }


discardableResult

dynamicCallable

  1. @dynamicCallable
  2. struct TelephoneExchange {
  3. func dynamicallyCall(withArguments phoneNumber: [Int]) {
  4. if phoneNumber == [4, 1, 1] {
  5. print("Get Swift help on forums.swift.org")
  6. } else {
  7. print("Unrecognized number")
  8. }
  9. }
  10. }
  11. let dial = TelephoneExchange()
  12. // Use a dynamic method call.
  13. dial(4, 1, 1)
  14. // Prints "Get Swift help on forums.swift.org".
  15. dial(8, 6, 7, 5, 3, 0, 9)
  16. // Prints "Unrecognized number".
  17. // Call the underlying method directly
  18. dial.dynamicallyCall(withArguments: [4, 1, 1])


  1. @dynamicCallable
  2. struct Repeater {
  3. func dynamicallyCall(withKeywordArguments pairs: KeyValuePairs<String, Int>) -> String {
  4. return pairs
  5. .map { label, count in
  6. repeatElement(label, count: count).joined(separator: " ")
  7. }
  8. .joined(separator: "\n")
  9. }
  10. }
  11. let repeatLabels = Repeater()
  12. print(repeatLabels(a: 1, b: 2, c: 3, b: 2, a: 1))
  13. // a
  14. // b b
  15. // c c c
  16. // b b
  17. // a


repeatLabels(a: "four") // Error


dynamicMemberLookup

  1. @dynamicMemberLookup
  2. struct DynamicStruct {
  3. let dictionary = ["someDynamicMember": 325,
  4.    "someOtherMember": 787]
  5. subscript(dynamicMember member: String) -> Int {
  6. return dictionary[member] ?? 1054
  7. }
  8. }
  9. let s = DynamicStruct()
  10. // Use dynamic member lookup.
  11. let dynamic = s.someDynamicMember
  12. print(dynamic)
  13. // Prints "325"
  14. // Call the underlying subscript directly.
  15. let equivalent = s[dynamicMember: "someDynamicMember"]
  16. print(dynamic == equivalent)
  17. // Prints "true"


キーパスによる動的メンバルックアップを使用して、コンパイル時の型チェックをサポートする方法で包み込む型を実装できます。例えば:


  1. struct Point { var x, y: Int }
  2. @dynamicMemberLookup
  3. struct PassthroughWrapper<Value> {
  4. var value: Value
  5. subscript<T>(dynamicMember member: KeyPath<Value, T>) -> T {
  6. get { return value[keyPath: member] }
  7. }
  8. }
  9. let point = Point(x: 381, y: 431)
  10. let wrapper = PassthroughWrapper(value: point)
  11. print(wrapper.x)


frozen


GKInspectable

inlinable

main

  1. @main
  2. struct MyTopLevel {
  3. static func main() {
  4. // Top-level code goes here
  5. }
  6. }


  1. protocol ProvidesMain {
  2. static func main() throws
  3. }


nonobjc

NSApplicationMain

  1. import AppKit
  2. NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv)


NSCopying

NSManaged

objc

注意: objc 属性への引数は、その宣言の実行時名も変更できます。NSClassFromString など、Objective-C 実行時環境と対話する関数を呼び出すとき、およびアプリの Info.plist ファイルでクラス名を指定するときには、実行時名を使用して下さい。引数を渡すことで名前を指定した場合、その名前は Objective-C コードの名前および実行時名として使用されます。引数を省略すると、Objective-C コードで使用される名前は Swift コードの名前と一致し、実行時名は名前をめちゃくちゃにする通常の Swift コンパイラ規則に従います。


0

objcMembers

propertyWrapper


  1. @propertyWrapper
  2. struct SomeWrapper {
  3. var wrappedValue: Int
  4. var someValue: Double
  5. init() {
  6. self.wrappedValue = 100
  7. self.someValue = 12.3
  8. }
  9. init(wrappedValue: Int) {
  10. self.wrappedValue = wrappedValue
  11. self.someValue = 45.6
  12. }
  13. init(wrappedValue value: Int, custom: Double) {
  14. self.wrappedValue = value
  15. self.someValue = custom
  16. }
  17. }
  18. struct SomeStruct {
  19. // Uses init()
  20. @SomeWrapper var a: Int
  21. // Uses init(wrappedValue:)
  22. @SomeWrapper var b = 10
  23. // Both use init(wrappedValue:custom:)
  24. @SomeWrapper(custom: 98.7) var c = 30
  25. @SomeWrapper(wrappedValue: 30, custom: 98.7) var d
  26. }


  1. @propertyWrapper
  2. struct WrapperWithProjection {
  3. var wrappedValue: Int
  4. var projectedValue: SomeProjection {
  5. return SomeProjection(wrapper: self)
  6. }
  7. }
  8. struct SomeProjection {
  9. var wrapper: WrapperWithProjection
  10. }
  11. struct SomeStruct {
  12. @WrapperWithProjection var x = 123
  13. }
  14. let s = SomeStruct()
  15. s.x   // Int value
  16. s.$x // SomeProjection value
  17. s.$x.wrapper   // WrapperWithProjection value


requires_stored_property_inits

testable

この属性を import 宣言に適用して、モジュールのコードのテストを簡素化するそのアクセス制御への変更をそのモジュールにインポートします。internal アクセスレベル修飾子でマークされているインポートされたモジュール内の実体は、public アクセスレベル修飾子で宣言されているかのようにインポートされます。internal または public アクセスレベル修飾子でマークされたクラスとクラスメンバは、open アクセスレベル修飾子で宣言されているかのようにインポートされます。インポートされたモジュールは、テストを有効にしてコンパイルされなければなりません。


UIApplicationMain

usableFromInline

warn_unqualified_access


インターフェイスビルダーで使われる宣言属性


インターフェイスビルダーの属性は、Xcode と同期するようにインターフェイスビルダーで使用される宣言属性です。Swift は、以下のインターフェースビルダーの属性を提供しています。 IBAction, IBSegueAction, IBOutlet, IBDesignable, および IBInspectable です。これらの属性は、Objective-C で対応する物と概念的に同じです。


IBOutlet と、IBInspectable 属性は、クラスのプロパティ宣言に適用されます。クラスのメソッド宣言には IBActionIBSegueAction 属性を適用し、クラス宣言には IBDesignable 属性を適用して下さい。


IBAction, IBSegueAction, IBOutlet, IBDesignable, または IBInspectable 属性を適用しても、objc 属性を含みます。


型の属性


型の属性は、型にだけ適用できます。


autoclosure


convention

escaping

この属性をメソッドまたは関数宣言内のパラメータの型に適用し、後で実行するためにパラメータの値を格納できることを示します。これは、その値が呼び出しの寿命を超えて生きることを許可されていることを意味します。escaping 型の属性を持つ関数型パラメータには、プロパティまたはメソッドの self. の明示的な使用が必要です。escaping 属性の使用例については、クロージャのエスケープ を参照してください。


Switch Case 属性


switch case 属性は switch の case にのみ適用できます。


unknown


この属性を switch case に適用して、コードがコンパイルされた時点で既知の列挙型のいずれの case とも一致しないと予想されることを示します。unknown 属性の使用方法の例については、将来の列挙型 case の切り替え を参照してください。


属性の文法

attribute@­ attribute-name ­attribute-argument-clause ­opt
­ attribute-nameidentifier­
attribute-argument-clause( balanced-tokens ­opt ­)
attributesattribute attributes ­opt

balanced-tokens­balanced-token balanced-tokens ­opt
balanced-token( balanced-tokens ­opt ­)
balanced-token[ balanced-tokens ­opt ­]
balanced-token balanced-tokens ­opt ­}
balanced-token → Any identifier, keyword, literal, or operator
balanced-token → Any punctuation except (­, ) , [­, , {­, or }


前:宣言 次:パターン
















トップへ












トップへ












トップへ












トップへ
目次
Xcode の新機能

Swift について
Swift と Cocoa と Objective-C (obsolete)
Swift Blog より (obsolete)

SwiftLogo
  • Swift 5.3 全メニュー


  • Swift へようこそ
  • Swift について

  • Swift 言語のガイド

  • 言語リファレンス
  • 言語リファレンスについて
  • 語彙の構造



  • 宣言
  • 属性
  • パターン
  • 汎用パラメータと引数
  • 文法のまとめ

  • マニュアルの変更履歴













  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ