詳解Swift(7)〜演算子

2016. 07. 16
この記事は詳解 Swift(初版第1刷)を元に、Xcode 7.3.1(Swift 2.2)下における差異を記述しています。



CHAPTER 07 演算子



●7.1 Swiftの演算子


・オーバーフロー演算子

0除算の例において、本書では計算結果が0になるとありますが、現在はエラーが出るようになっています。

var d = 0, w = 10
w = w &/ d    // error: use of unresolved operator '&/'

これに関して「Xcode Release Notes(Xcode 6.3 Release Notes/Changes, Enhancements, and Notes/Swift Language Changes)」に、&/ と &% 演算子は削除されたと記述があります。

「&/ と &% 演算子は言語を簡素化し一貫性を向上させるため削除されました。

これらの演算子は &+ や &- 、そして &* 演算子とは異なり、ゼロによる除算や剰余、そして Int.min / -1 を特殊なケースとして動作し、2の補数計算動作を提供していませんでした。
これらのテストは必要に応じて、比較としてコード内で明示的に記述する必要があります。(17926954)」



・ビット演算子と論理演算子

本書では短絡評価を回避する例として、論理演算子( ||  と && )の代わりにビット演算子( | と & )で Bool 値の論理和・論理積を求めていますが、現在は Int 系型と Self 以外はエラーになるようです。
(「articles of samekard/Swiftのコンパイルエラー寄せ集め」参照)

var b = true
var c1 = b | odd(1)    // error: binary operator '|' cannot be applied to two 'Bool' operands
// note: overloads for '|' exist with these partially matching parameter lists: (UInt8, UInt8), (Int8, Int8), (UInt16, UInt16), (Int16, Int16), (UInt32, UInt32), (Int32, Int32), (UInt64, UInt64), (Int64, Int64), (UInt, UInt), (Int, Int), (Self, Self)
( '&' についても同様)

なお Xcode 7.3 においても論理演算子( ||  と && )の複合代入演算子は利用できず、また Bool 値に対してビット演算子( | と & )の複合代入演算子は利用できません。

c1 ||= odd(2)   // error: use of unresolved operator '||='
c2 &&= odd(4)   // error: use of unresolved operator '&&='

c1 |= odd(2)    // error: binary operator '|=' cannot be applied to two 'Bool' operands
// note: overloads for '|=' exist with these partially matching parameter lists: (inout UInt8, UInt8), (inout Int8, Int8), (inout UInt16, UInt16), (inout Int16, Int16), (inout UInt32, UInt32), (inout Int32, Int32), (inout UInt64, UInt64), (inout Int64, Int64), (inout UInt, UInt), (inout Int, Int), (inout T, T)



●7.2 演算子の定義


・二項演算子の定義

List7-1において、「詳解Swift(5)〜基本的なデータ型」で述べたように文字列の文字数を数える countElements() は廃止になったので .characters.count に、「詳解Swift(1)〜Swiftでプログラミング」で述べたように C 言語様式の for 文は非推奨になったため stride 型を使った for-in 文に修正する必要があります。

let pad = w - countElements(str)        // error: use of unresolved identifier 'countElements'
let pad = w - str.characters.count

for var wid = 2; wid <= 6; wid += 2 {        // C-style for statement is deprecated and will be removed in a future version of Swift
for var wid in 2.stride(through: 6, by: 2) {


・構造体に対する演算子の定義

List7-3において「詳解Swift(3)〜構造体」で述べたように、定数プロパティへの割り当ては一度のみとなったため、構造体 Time のプロパティ hour と min を定数にするとインスタンス生成時にエラーが出ます。

struct Time {
    let hour = 0, min = 0    // プロパティが定数のため、インスタンス生成時にエラーが出る
   
    func add(min:Int) -> Time {
        var m = self.min + min
        var h = self.hour
        if m >= 60 {
            h = (h + m / 60) % 24
            m %= 60
        }
        return Time(hour:h, min:m)    // Argument passed to call that takes no arguments
    }
// (中略)
}

add メソッドだけでなく実行例でのインスタンス生成時もエラーとなるので、プロパティ hour と min は変数にする必要があります。

また「詳解Swift(1)〜Swiftでプログラミング」で述べたように通常のインクリメント/デクリメントの ++ / -- 演算子は Swift 3.0 で削除するため廃止になりましたとの警告が出ますが、構造体 Time 型に対しては List7-4 で別途定義しているため警告は出ません。


・短絡評価をする演算子の定義

List7-6 と List7-7 の @autoclosure の部分で、「@autoclosureはパラメータの(型ではなく)宣言でのみ使用できます」とエラーが出るようになりました。

func skip(cond:Bool, arg:@autoclosure() -> Int) {        // error: @autoclosure may only be used on 'parameter' declarations

これに関しては「Xcode Release Notes(Xcode 6.3 Release Notes/Changes, Enhancements, and Notes/Swift Language Changes)」で次のように記述されています。

「@autoclosure 属性は現在パラメータの型の属性ではなく、パラメータの属性となっています。

以前はこのように使用していたと思いますが、

func assert(predicate : @autoclosure () -> Bool) {...}

現在は以下のように記述します。

func assert(@autoclosure predicate : () -> Bool) {...}

(15217242)」


したがって List7-6 は以下のように修正することになります。
(List7-7 も同様)

func skip(cond:Bool, @autoclosure arg: () -> Int) {



articles of samekard/Swiftのコンパイルエラー寄せ集め

詳解 Swift 改訂版(Amazon)
 






Bose SoundSport wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
02 | 2017/03 | 03
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
WACOM


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
BOSE

Bose SoundSport wireless headphones
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
SQLite
OpenGL ES
Amazon


Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Profile

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

QR Code
QR
Visitors