詳解Swift(3)〜構造体

2016. 06. 12
(※2016年6月12日追記:この記事は詳解 Swift(初版第1刷)を元に、Xcode 7.3.1(Swift 2.2)下における加筆・修正を行っています。)



CHAPTER 03 構造体



●3.1 構造体の定義


・構造体の定数プロパティ

List3-2のように、初期値を持つ定数が含まれる構造体で全項目イニシャライザを使おうとするとエラーが出るようになりました。

struct Time {
    let in24h: Bool = false
    var hour = 0, min = 0
}

var t = Time(in24h: true, hour:20, min:0)
// error: cannot invoke initializer for type 'Time' with an argument list of type '(in24h: Bool, hour: Int, min: Int)'
// note: overloads for 'Time' exist with these partially matching parameter lists: (hour: Int, min: Int), ()


これは「Dorapro エンジニアBLOG/[Swift] Xcode6.3に上げたらビルドが通らなかった話」の「インスタンスのlet定数への代入は、初期値を含め一度のみ」でも指摘されているようにXcode6.3/Swift1.2で変更されたもので、「Xcode Release Notes(Xcode 6.3 Release Notes/Changes, Enhancements, and Notes/Swift Language Changes)」に以下のように記述されています。

「構造体やクラスのイニシャライザにおける不変(let)プロパティは、一般的な「一度初期化したら再割り当てや変更はできない」というモデルの標準に合わせるために改訂されました。以前はイニシャライザの本文内で完全に可変でした。現在は値を提供するために一度だけ割り当てることを許可されています。プロパティが宣言内で初期値を持っている場合、全てのイニシャライザでの初期値としてカウントされます。(19035287)」

これまでの定数プロパティは、構造体の宣言内で初期値が設定されていてもインスタンス生成時に再設定することが可能でしたが、「定数は一度だけ設定できる」という原則に従うようにしたというわけです。

したがって上記の構造体 Time の場合、インスタンス生成時に入力補完として定数プロパティ in24h は含まれません。
定数プロパティをインスタンス生成時に設定したい場合は、宣言時に初期値を与えないようにする必要があります。

struct Time {
    let in24h: Bool
    var hour = 0, min = 0
}

var t = Time(in24h: true, hour: 20, min: 0)


・複数個のイニシャライザを定義する

上記の通り定数プロパティは再設定できなくなっており、且つList3-4の最初のイニシャライザは時と分のみ与えているため in24h には初期値が必要であり、また二つ目のイニシャライザでは in24h を置き換えているため、in24h は変数プロパティにして試すと良いでしょう。

struct Time {
//     let in24h: Bool = false
    var in24h: Bool = false
    var hour = 0, min = 0
    init(hour:Int, min:Int) {
        self.hour = hour
        self.min = min
    }
    init(hourIn24 h:Int) {
        in24h = true
        hour = h
    }
    init(_ hour:Int) {
        self.init(hourIn24: hour)
    }
}



●3.2 メソッド


・インスタンスに対するメソッドの定義

詳解Swift(2)〜関数」の「外部引数名」の項で述べたように、Swift 2.0からメソッドと関数は外部引数名に同じ規則が適用されることになり、メソッドの規則が関数にも適用されることになりました。
したがってTable3-1は以下のようになります。

Table3-1 関数、イニシャライザ、メソッドの外部引数名に関するまとめ

関数イニシャライザメソッド
関数/メソッド名自由(関数の機能を説明するもの)
関数の機能と第1引数を説明するもの
常にinit関数の機能と第1引数を説明するもの
返り値自由なし自由
内部引数名と外部引数名の関係明示しなければ、外部引数名にはならない
第2引数以降について、自動的に外部引数名になる
自動的にすべてが外部引数名になる第2引数以降について、自動的に外部引数名になる
外部引数名を指定するには外部引数名を明示する。または#を指定して同じ名前を使うことを示す。
外部引数名を明示する。第2引数以降への#の指定は冗長(※ #は使用不可)
外部引数名を明示する。#の指定は冗長
(※ #は使用不可)
外部引数名を明示する。第2引数以降への#の指定は冗長(※ #は使用不可)
外部引数名を使わないようにするには何もしない。または外部引数名として「_」を指定する 
外部引数名として「_」を指定する。第1引数に対する指定は冗長
外部引数名として「_」を指定する外部引数名として「_」を指定する。第1引数に対する指定は冗長



●3.3 プロパティ


・グローバルなスコープを持つ計算型プロパティの定義

コードの動作確認にプレイグラウンドを使用している方も多いと思いますが、プレイグラウンドファイル作成時にPlatformでiOSを選択した場合、NSScreenクラスを使用しているList3-13は動かせません。

OS Xコード用に別途プレイグラウンドファイルを作成してもいいのですが、一時的にコードを試すだけならPlatformの設定を変えた方が早いでしょう。

1)Xcodeのメニューで、View > Utilities > Show File Inspectorを選択します。
2)ファイルインスペクタのPlayground Settingsで、PlatformをiOSからOS Xに変更します。
3)プラットフォームをOS Xにすると、先頭行にあるUIKitのインポートが無効になるのでコメントアウトします。

後はCocoaをインポートすればOS X用のコードを記述できます。
(エラーが出る場合はファイルをセーブ後に一旦閉じて、再度開くと治るかもしれません。)

元のiOS用に戻すには逆の手順を踏みます。

1)Cocoaのインポートを含むOS X用コードを削除ないしコメントアウトする。
2)コメントアウトしたUIKitのインポートを復活させる。
3)ファイルインスペクタでPlatformをiOSに変更する。



●3.4 添字付け


・2次元以上の添字付け

List3-16 の 2つ目の subscript ですが、subscript も関数と同様に仮引数を変数としようとすると「'var' は Swift 3 で削除するため廃止になりました」と警告が出るようになりました。

8043.png

したがって以下のように修正する必要があります。

subscript(曜日:Week, var 時間:Int) -> String {    // 'var' parameters are deprecated and will be removed in Swift 3
    let arr = self[曜日]
    時間--    // '--' is deprecated: it will be removed in Swift 3
    return 時間 < arr.count ? arr[時間] : ""
}

subscript(曜日:Week, 時間:Int) -> String {    // 仮引数 '時間' の var を削除
    let arr = self[曜日]
    let 時間_ = 時間 - 1    // '時間' をデクリメントして定数 '時間_' に代入
   return 時間_ < arr.count ? arr[時間_] : ""
}



Dorapro エンジニアBLOG/[Swift] Xcode6.3に上げたらビルドが通らなかった話

Wikipedia/液量オンス

Qiita/Swift 2.2でインクリメントとデクリメント

詳解 Swift 改訂版(Amazon)
 







QuietControl 30 wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
04 | 2017/05 | 06
Sun Mon Tue Wed Thu Fri Sat
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

QuietControl 30 wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR