詳解Swift改訂版(03)〜構造体

2017. 01. 03
この記事は詳解 Swift 改訂版(初版第1刷)を元に、Xcode 8.2.1(Swift 3.0.2)下における差異を記述しています。



CHAPTER 03 構造体



●3.1 構造体の定義


・関数とイニシャライザの記法のまとめ

詳解Swift改訂版(02)〜関数」で述べたように、Swift 3 から関数の引数は第1引数も含めて全てラベル付け(外部引数名化)されたので、引数名に関するイニシャライザと関数/メソッドの記法の差が無くなり統一されました。
(Objective-C に引き摺られたルールですから、むしろ何故最初からこうしなかったのかというようなことでしたし…)

したがって Table3-1 は次ようになります。

イニシャライザ関数/メソッド
手続き名常にinit自由(関数の機能と第1引数を説明するもの)
※第1引数を説明する必要がないので、関数の機能だけでも良い?
返り値記述しない自由
明示的に指定しない場合の、内部引数名と外部引数名の関係内部引数名は、自動的にすべてが外部引数名になる第1引数には外部引数名は使われない。
第2引数以降について、内部引数名が自動的に外部引数名になる

内部引数名は、自動的にすべてが外部引数名になる
外部引数名を使わないようにするには外部引数名として「_」を指定する外部引数名として「_」を指定する。
第1引数に対する指定は冗長

また前述のとおり「(1) 引数に対する var または let の指定」は Swift 3 からできません。



●3.2 メソッド


・構造体の内容を変更するメソッド

流れで分かると思いますが、構造体 Clock の実行例で、変数 tic は Time ではなくClock、最後の出力する変数は tm ではなく tic です。
(前版ではこの内容の例を構造体 Time、変数 tm で行なっていたため、単純な修正ミスです)

var tic = Time(hour: 19, min: 40)
var tic = Clock(hour: 19, min: 40)

print(tm.toString())
print(tic.toString())


・イニシャライザとメソッド

List3-11 において、イニシャライザの「year = y」の後ろは「,」ではなく「;」です。

year = y, month = m; day = d        // Consecutive statements on a line must be separated by ';'

year = y; month = m; day = d



●3.3 プロパティ


・格納型プロパティの初期値を式で設定する

List3-14 において、定数プロパティ serial の初期値設定はインクリメント演算子を使用しているためエラーが出ます。

let serial = "CZ:\(++serialNumber)"        // error: '++' is unavailable: it has been removed in Swift 3

しかし文字列埋め込みに複合代入演算子を用いた式は使えません。

let serial = "CZ:\(serialNumber += 1)"        // CZ:()

かといってグローバル変数 serialNumber のインクリメント演算を構造体の定義上で行うことはできません。
(「Qiita/[Swift] メモ」参照)

serialNumber += 1        // Expected declaration
let serial = "CZ:\(serialNumber)"

定数 serial はインスタンスが生成される度にインクリメントされるものですから、演算はイニシャライザで行うのが自然です。
ただし本文中で解説している通り、「プロパティの初期値を指定する式は、イニシャライザの実行の直前に評価されます」ので、定数 serial の値を設定した後にイニシャライザでインクリメントしても間に合いません。

let serial = "CZ:\(serialNumber)"
init(_ w:Int, _ h:Int) {
    serialNumber += 1        // CZ:2127

したがって定数 serial は型宣言だけにし、イニシャライザでインクリメント後に値を設定する必要があります。

let serial: String
init(_ w:Int, _ h:Int) {
    serialNumber += 1
    serial = "CZ:\(serialNumber)"        // CZ:2128

ただ本項の目的は「格納型プロパティの初期値を式で設定する」ですから、「型定義+イニシャライザでの設定」では意味がありません。
今回は設定する式が Swift 3 で廃止されたインクリメント演算で、代替の複合代入演算が文字列埋め込みで使えないために目的から逸れた解決法になりましたが、代入を伴わない演算であれば定義上で設定できるはずです。


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

List3-17 において、NSScreen クラスの mainScreen() は main() に改名されたようです。

let size = NSScreen.mainScreen()!.frame.size        // error: 'mainScreen()' has been renamed to 'main()'

let size = NSScreen.main()!.frame.size



Qiita/[Swift] メモ

詳解Swift 第3版(Amazon)
 






Wave SoundTouch music system IV
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
06 | 2017/07 | 08
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

Wave SoundTouch music system IV
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