2017年11月15日水曜日

Swift、フォー!

「フォー!」って叫んでたあの芸人さん、最近見ませんね。僕があまりテレビを見ないから、そう思うだけかもしれませんけど。


Xcode9になって、Swift4が使えるようになりました。

Swift3で書かれたプロジェクトを開くと、Swift4への変換のメッセージがでます。

なんだかframeworkやCocoaPodsも巻き込んでいきそうな感じです。以前のSwiftのアップデート時には、派手にソースが変更されて冷や汗をかきました。

今回ももしやと、びくびくしながら続けていくと、大した変更はありませんでした。

変換された部分は、#selector()で指定しているイベントのアクションの関数の定義に、@objcが付けられた程度です。

    //略
    let nc = NotificationCenter.default
    nc.addObserver(self,
                   selector: #selector(Foo.bar),
                   name: "piyo"
                   object: nil)
    //略
    @objc func bar() {
        //略
    }
    //略

しかし、なぜ@objcなんでしょうか。このプロジェクトはすべてSwiftで書かれていますし、何だか腑に落ちないです。どこから来たのobjc属性。

しかも追加された@objcの箇所にワーニングが出力されます。何か間違ってませんか?


Selector Expression
A selector expression lets you access the selector used to refer to a method or to a property’s getter or setter in Objective-C.

#selector(method name)
#selector(getter: property name)
#selector(setter: property name)

The method name and property name must be a reference to a method or a property that is available in the Objective-C runtime. The value of a selector expression is an instance of the Selector type.

(“The Swift Programming Language (Swift 3.1)”/Apple Inc.より)


ふむふむ。


セレクタはObjective-Cの概念であるため、Selector型を生成するにはメソッドがObjective-Cから参照可能である必要があります。メソッドをObjective-Cから参照可能にするには、objc属性を指定します。

(Swift実践入門/石川洋資,西山勇世 P289より)


なるほど。

どこかからObjctive-Cが湧いてきたわけではなく、そもそもセレクタはObjecive-Cのランタイムにおける概念なのですね。

これはSwift4の書式に変換してくれたというより、本来必要だった@objcを、厳しくなったコンパイラのために付けてくれたということなのでしょう。


試しに、@objcを削除してみるとエラーになります。

Argument of '#selector' refers to instance method 'bar()' that is not exposed to Objective-C
Add '@objc' to expose this instance method to Objective-C


ちなみに、objc属性の箇所のワーニングですが、

The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "xxxxxx" target.

これは、TARGETSのBuild Settingsをswiftで検索して、Swift 3 @objc Inference(Onになっていると思います)を、Defaultにすると消えます。



これで安心してSwift4を使えますね。




2017年11月1日水曜日

チューニングなどという(だからチューナー編)

チューニングについて書いてきましたが、初心者にとって、ギターを正しくチューニングするのは、なかなか大変です。


そこでチューニングメーターですよ。奥さん。


市販されているものはだいたい大丈夫だと思うので、特別高価なものである必要はありません。利用する状況に応じて決めると良いのではないでしょうか。例えば、エレキギターならシールドを直接つなぐことができるタイプとか、アコースティックギターならクリップ式のものだとか。

クリップ式だと、ちょっと古いですがKORGのAW-1を持っています。アコースティックギターはもちろん、ソリッドボディーのエレキギターでも大丈夫です。ヘッドというかネックって、思っている以上に振動してるんですね。あと、メーターが機械式じゃないもの方が、少しくらい雑に扱っても故障しにくいかもしれません。

どれもちょっと古いですが。

普段のチューニングに加えて、エレキギターの場合はオクターブチューニングが必要です(あ、いや、アコースティックギターでも本来必要ですが、自分でやる人は少ないと思います。僕もやったことはないです)。つまりサドルの調整ですね。最低でも弦を交換したタイミングでは行うべきです。これはチューナーなしでは無理です。工夫すれば、できなくはなさそうですが、そんなこと普通はやらないでしょう。素直にチューナーを使いましょう。21世紀なんですから。

チューナーの使い方ですが、合わせたい音を設定する方法は機種によって違いますが、メーターの見方は同じです。針が真ん中が音があっている状態、左が低い(フラット)、右が高い(シャープ)です。

アプリのヘルプ用に作った動画があるので、よかったら見てみてください。(画質が良くないのは、スマホ用に少しでもパケットを節約して見てもらえるようにするためなので、許してください)

合わせたい弦を、びーんと鳴らしたとき、針が真ん中より左を指していたら、ゆっくりとペグを巻き上げて、中心を指すようにします。

もし、真ん中より右を指しているときは、ギターの音が高いので、ペグを回して緩めればいいわけです。でも、音を合わせるときには「低い方から巻き上げながら合わせる」というのがお約束でしたから、一度針が左側に来るまで緩めてから、ゆっくりと巻き上げながら針を真ん中に合わせるのがいいと思います。


こんな感じで、チューナーがあればチューニングを素早く簡単にできます。そして何より正確です。必携です。




「チューニングなどという(貴族編)」に続きます。