トップページ⇒tech
1002コメント350KB

Swift part8 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (アウアウ Saaf-caug)2016/05/13(金) 23:30:06.87ID:MRCJQvHca
WWDC2014で発表されたAppleの新言語Swiftについて語りましょう

関連スレ

プログラミング言語Swift 3
http://potato.2ch.net/test/read.cgi/mac/1408762479/

[SDK]iPhoneアプリ開発初心者質問箱45[touch][iPad]
http://potato.2ch.net/test/read.cgi/mac/1447650023/

Xcode part13 [転載禁止]c2ch.net
http://potato.2ch.net/test/read.cgi/mac/1424907278/

Swiftアンチスレ part1
http://echo.2ch.net/test/read.cgi/tech/1458491343/

前スレ
Swift part7
http://echo.2ch.net/test/read.cgi/tech/1458491528/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0237デフォルトの名無しさん (ササクッテロ Spc9-s3GQ)2016/06/30(木) 08:37:21.45ID:sNJzBkxbp
そんな自分都合の思い込み(言い訳)は知らんよ
あと、getなんちゃらとfindなんちゃらの計算コストが違うという共通認識を皆が持ってるか疑問
という疑問も持った方がいいな、コメントにでも注釈付けとけ
0238デフォルトの名無しさん (アウアウ Saf6-dfX6)2016/06/30(木) 09:12:12.94ID:EbiLSiSEa
ボトルネック探しやチューニングはある程度完成してからまとめてやれ
>>236はA型っぽいな
0239デフォルトの名無しさん (ワッチョイ 9910-/PL2)2016/06/30(木) 13:31:10.66ID:msjqUaEK0
>>237
前半分は>>234に対する疑問で、
「普通はキャッシュや事前計算」って言える程普通じゃないだろうってことを言いたいだけだったんだけど、大抵のケースでキャッシュや事前計算で解決できると思ってるのだって思い込みだろう?

後ろ半分の話は>>233に対する疑問でプロパティの代わりにgetメソッドが用意されてたら沢山呼ばないほうがいい風潮になってるの?ってことを聞きたかったんだけど
個人的にはgetとfindだったらfindは毎回計算してそう、と言っただけで皆そう思ってるはずだからこうするべきと言ってるわけじゃないのになんでget/findの共通認識がどうのっていう言い方で返されるのか疑問
0240デフォルトの名無しさん (アウアウ Sa61-bRa0)2016/06/30(木) 13:41:20.24ID:nPgPHtAra
高コストである旨はコメントに書いておけばいい
はい、解決
0241デフォルトの名無しさん (ササクッテロ Spc9-s3GQ)2016/06/30(木) 16:03:43.53ID:sNJzBkxbp
長い三行で
0242デフォルトの名無しさん (オイコラミネオ MMb4-oxCW)2016/06/30(木) 17:46:55.60ID:UTC/JhrUM
Tab BarとPage Controlを組み合わせたUIどう思う?
(iOS Human Interface Guidelinesと照らし合わせてみて)
0243デフォルトの名無しさん (アウアウ Saf6-dfX6)2016/06/30(木) 17:59:01.00ID:1eFZP5OCa
普通
0244デフォルトの名無しさん (ワッチョイ 613c-R7o+)2016/06/30(木) 21:24:06.00ID:LYDVxhPg0
Twitterとかもやってるし別に普通だな
0245デフォルトの名無しさん (ワッチョイ 1e93-oxCW)2016/06/30(木) 22:06:23.41ID:Y+MKvNri0
レスありがとうね( ^ω^ )
0246デフォルトの名無しさん (オイコラミネオ MMb4-oxCW)2016/07/01(金) 10:42:50.38ID:kTHfiOpEM
iOSのiTunes StoreライクにTab Barの色をView毎に変えるにはどうすればよいですか?
0247デフォルトの名無しさん (ワッチョイ e0c9-dfX6)2016/07/01(金) 11:05:47.74ID:iZbsZJ7a0
>>246
[SDK]iPhoneアプリ開発初心者質問箱46[touch][iPad] [無断転載禁止]©2ch.net
http://potato.2ch.net/test/read.cgi/mac/1460975101/
0248デフォルトの名無しさん (ワッチョイ 613c-dfX6)2016/07/04(月) 01:39:07.20ID:jde26vCm0
たまに遭遇するgetオンリーな操作子ウザイんだけど何であんなものが必要なわけ?
例えば 配列.last で最後のやつ弄りたいのにgetオンリーでエラーって誰得?
0249デフォルトの名無しさん (アウアウ Saf6-dfX6)2016/07/04(月) 02:00:42.87ID:0HQjDP9Aa
お前のようなアホに勝手に配列の中身を変えられないようにするため
0250デフォルトの名無しさん (ワッチョイ dd91-s3GQ)2016/07/04(月) 09:08:10.81ID:/fDVk2WK0
お前以外が特に得しないsetterは別にいらんけど
俺得なインターフェースが欲しいなら適当にextensionで追加しろ
0251デフォルトの名無しさん (ワッチョイ e0c9-dfX6)2016/07/04(月) 16:07:03.69ID:tmQPI5vq0
lastにsetとか、最後尾を入れ替えるのか、最後尾に付け足すのか分かりづらいだろ
0252デフォルトの名無しさん (アウアウ Sa25-dfX6)2016/07/04(月) 16:14:50.13ID:3xy2R967a
いやそういう問題ではないんだが...
0253デフォルトの名無しさん (アウウィフ FF25-PhU/)2016/07/04(月) 16:40:04.39ID:igr6hGQQF
appendよりもaddendの方が判りやすいというのなら同意したのに
0254デフォルトの名無しさん (ワッチョイ 613c-dfX6)2016/07/04(月) 16:58:30.84ID:luyT0NF10
>>251
最後尾に追加はappendでしょ
lastって普通最後尾のエレメントを指さないか?
0255デフォルトの名無しさん (ワッチョイ 613c-dfX6)2016/07/04(月) 21:24:07.43ID:7j/w943c0
ようするにこういうことでしょ
var array= [1, 1, 4, 5, 1, 4]
array.last = 1919
array // => [1, 1, 4, 5, 1, 1919]
0256デフォルトの名無しさん (ワッチョイ dd91-s3GQ)2016/07/04(月) 21:40:05.02ID:/fDVk2WK0
それはみんな分かってなんやかんや言ってるんだが...
0257デフォルトの名無しさん (アウアウ Sa25-dfX6)2016/07/04(月) 22:02:44.49ID:1KMIHZLQa
しかし、変なこと考える奴がいるもんだな
なぜそうなってるのかは考えようとせずとにかく自分の思い通りの動きをしないものが気に入らなくてしようがないんだろうな
0258デフォルトの名無しさん (アウアウ Sa61-gY7w)2016/07/05(火) 00:43:22.40ID:+KIX5k5ra
タプルの比較で質問です、
(1, "aaa") < (1, "bbb")
がtrueになるのはどうしてでしょうか、
< は未満だからfalseになると思うんですが
0259デフォルトの名無しさん (アウアウ Sa61-gY7w)2016/07/05(火) 00:54:02.88ID:+KIX5k5ra
すみません、自己解決しましたなんとなく
0260デフォルトの名無しさん (ワッチョイ e0c9-dfX6)2016/07/05(火) 00:56:10.26ID:ujdX1xtz0
/// A [lexicographical order](https://en.wikipedia.org/wiki/Lexicographical_order)
/// over tuples of `Comparable` elements.
///
/// Given two tuples `(a1, a2, ..., aN)` and `(b1, b2, ..., bN)`, the
/// first tuple is `<` the second tuple iff `a1 < b1` or
/// (`a1 == b1` and `(a2, ..., aN) < (b2, ..., bN)`).
public func <<A : Comparable, B : Comparable>(lhs: (A, B), rhs: (A, B)) -> Bool
0261デフォルトの名無しさん (ワッチョイ 613c-dfX6)2016/07/05(火) 07:52:58.12ID:SiEQh+4z0
何で{ get }にするのか未だに解ってないんだが、、
配列.lastの所を勝手に書き換えようと思えば配列[配列.endIndex - 1 ]で書き換えられる訳だし、単に不便な関数って認識しかまだ無い
0262デフォルトの名無しさん (アウアウ Sa25-dfX6)2016/07/05(火) 09:55:20.08ID:hBbm7EY+a
なんで最後の要素だけ書き換えたがるのか知らんが、そんなプロパティ?必要か?
どうしても必要ならエクステンション使って自分で書けばいいだろ

コード読んでて、例えば配列の要素を検索するような明らかに配列の更新が不要な場面で、配列の要素を書き換え可能なプロパティが使われてるとちょっと不安にならね?
0263デフォルトの名無しさん (ワッチョイ 613c-dfX6)2016/07/05(火) 10:36:43.37ID:R42S1A9Q0
>>261
配列で置換する場合って、再生成するコストかかるからじゃねーの?
lastだけgetで欲しいのに内部でいちいちコピーされてたら遅くてたまんねーよ。
0264デフォルトの名無しさん (ワッチョイ 613c-dfX6)2016/07/05(火) 10:51:08.99ID:R42S1A9Q0
263だけど、なんかバカなこと書いたな。setの時だけコピーすりゃいいだけの話だから違うな。
あれだ、lastってnuallableだからemptyの時の動作が不定になるから・・・とか?
0265デフォルトの名無しさん (アウアウ Sa25-dfX6)2016/07/05(火) 10:52:33.32ID:hBbm7EY+a
いや要素書き換えたぐらいで配列のコピーはされんだろ
0266デフォルトの名無しさん (ワッチョイ e0c9-dfX6)2016/07/05(火) 11:42:26.00ID:ujdX1xtz0
lastは結果的にlastな要素なんであって、結果から逆算するようにセットするようなAPIは気持ち悪いわ
この気持ち悪さが分からんのはセンス無い
0267デフォルトの名無しさん (ササクッテロ Spc9-s3GQ)2016/07/05(火) 12:10:57.64ID:7+5nTqy/p
気分的な問題で要らないというアポー信者と
気分的な問題で要るという>>261の対立

>>261は宗教戦争するより、そういう教えもあるんだなと他宗教を許容しろや
0268デフォルトの名無しさん (スプー Sdb8-txjP)2016/07/05(火) 12:46:13.40ID:/c9Dk8+hd
a=3
a%2=0

でaが2になるような気持ち悪さ?
0269デフォルトの名無しさん (ササクッテロ Spc9-oxCW)2016/07/05(火) 13:35:55.55ID:Q726Zdnzp
開発中の言語なんでやろうと思えば何でも出来るけど、一般的に多用される用途に合わせて制限を設ける事でプログラマのミスを減らす
そんな言語思想で初心者がミスし辛い設計になっていると思う
俺もまだ勉強中なんで異論は認める
0270デフォルトの名無しさん (ワッチョイ 7a13-PhU/)2016/07/05(火) 13:39:56.96ID:3gyxqmIo0
Erlang最強ですねわかります
0271デフォルトの名無しさん (ササクッテロ Spc9-s3GQ)2016/07/05(火) 14:13:12.69ID:7+5nTqy/p
>>268
左辺に式を置く気持ち悪さが先行したぞ
0272デフォルトの名無しさん (スプー Sdb8-txjP)2016/07/05(火) 20:43:09.63ID:t4nMSGt4d
じゃあ
a.mod2=0
0273デフォルトの名無しさん (ワッチョイ 613c-dfX6)2016/07/06(水) 08:03:13.76ID:j5MI0TQH0
結局誰もわかってねーじゃねーか!( *`ω´)
.lastだけじゃ無く他にもいっぱいReadOnlyの奴あるからね!

と言ってもstartIndexとかendIndexは普通に納得なんだわ
.lastは『配列が空の時にnilが帰ってくるから』ってことで納得しようとも思ったけど
だったら他のやり方でもnilの可能性あるし.lastだけ{ get }にする意味があーもーマジわかんねーー
何でReadOnlyにしたのかコメントくらい書いといて欲しかったわ
0274デフォルトの名無しさん (ワッチョイ 9717-oxCW)2016/07/06(水) 08:19:38.69ID:Dt4/s9Lw0
>.lastは『配列が空の時にnilが帰ってくるから』ってことで納得しようとも思ったけど
は?
0275デフォルトの名無しさん (アウアウ Saf6-dfX6)2016/07/06(水) 09:25:41.67ID:qN9AduM4a
>>273
分かってねーのお前だけだから
0276デフォルトの名無しさん (ササクッテロ Spc9-s3GQ)2016/07/06(水) 10:12:42.12ID:5t5icW6ip
getter/setterがセットで存在しないと許せない教だというのはよく分かるぞ
俺も昔はその宗教しか知らなかったからな
経験積んだら理解できるようになるぞ、小僧
0277デフォルトの名無しさん (ワッチョイ 1e4e-oxCW)2016/07/06(水) 10:44:24.11ID:R/PvvFcq0
firstもあるんだろ?
0278デフォルトの名無しさん (ササクッテロ Spc9-dfX6)2016/07/06(水) 11:10:18.22ID:aB9cuo4xp
もしlastで値の変更が許可されていたとして、最後から2番目とか3番目の値を変更したくなった時はどうするつもりなんだろ
hoge.last = 100
hoge[hoget.count-2] = 200
hoge[hoget.count-3] = 300
とかするんか?
firstやlastには、配列を設計する時の定型的な役割があるんだけど、まぁこいつには分からないだろうな
0279デフォルトの名無しさん (ブーイモ MMb8-s3GQ)2016/07/06(水) 11:20:47.29ID:sEtBaoStM
結局setできないようにしたのは何でなの?
コレクションによってはオブジェクトの参照で済む場合とコピーが必要になる場合があってifの仕様が統一出来ないから?
0280デフォルトの名無しさん (ササクッテロ Spc9-75Z/)2016/07/06(水) 11:32:08.44ID:5t5icW6ip
setできないようにしてるんじゃなくて、getできるようにしただけだからなぁ
ObjCにもreadonlyプロパティは大量にあるし、C#やGoの他言語もgetterだけのアクセサあるわけで

逆になんで俺得I/Fをextensionで追加、というのが理解できないのか聞きたい
0281デフォルトの名無しさん (ワッチョイ 9717-oxCW)2016/07/06(水) 12:10:10.69ID:Dt4/s9Lw0
>>280
>setできないようにしてるんじゃなくて、getできるようにしただけだからなぁ
ものすごく明快な解答
0282デフォルトの名無しさん (ワッチョイ ddc9-4ceA)2016/07/06(水) 14:08:08.31ID:MAvTBHdK0
構造体の多重配列をつくって、
NSKeyedArchiverで保存したいんですけど。
どうすればいいですか?
0283デフォルトの名無しさん (アウアウ Saf6-dfX6)2016/07/06(水) 14:59:44.92ID:rM+MpLbOa
たまにはググってみろよ
0284デフォルトの名無しさん (ササクッテロ Sp1f-cFDw)2016/07/07(木) 02:42:59.97ID:wKF073iRp
getできるようにしただけなのは分かるんだけど、何でsetの記述しないのかが分からないんだよ。
extentionで改造してもいいんだけど意味不明な縛りのある言語って、、
やっぱ何らかの理由があると思うんだよなー
0285デフォルトの名無しさん (ワッチョイ 333c-6uh3)2016/07/07(木) 04:50:54.78ID:iQ3oQoSL0
ElementがOptional型だとおかしなことになりそう
0286デフォルトの名無しさん (ササクッテロ Sp1f-oo3f)2016/07/07(木) 07:32:54.39ID:XlMar3jmp
var hoge: Int?
で問題なかろう

数日付き合ったがこの宗教家はダメだな、、、
自分の信仰以外はセンスでの理解を拒否するから
setterが存在しない全てのプロパティになんで?を問いてくる

自分だけは信者じゃないと思ってる信者は怖い
まだ自覚あるアポー信者の方がマシだわ
0287デフォルトの名無しさん (ササクッテロ Sp1f-oo3f)2016/07/07(木) 07:49:21.83ID:387AC1iyp
理論武装を求めるのは意識高いから
swiftは意識高い系言語だから仕方ないね
0288デフォルトの名無しさん (スプー Sdbf-oo3f)2016/07/07(木) 08:07:01.67ID:sSwL/NX1d
全然違う角度からの話だけれど、ハードウェアが理解(=コンピュータの原理)が解っていれば、readサイクルと、writeサイクルが別物で有る事がわかる。
データバスに接続される物は、必ずしもメモリとは限らないと言う事も当然理解できるであろう。

例えば、タイマが接続されているとして、
書きこみ(=setter)は、パラメータの設定
読み込み(=getter)は、読み出しデータには意味が無く、読み出し行為によって、タイマのリセット
と言う回路が組まれていたとしたら、書き込みに対して、非可逆な動作をする。




これも、理解できないのかな?
0289デフォルトの名無しさん (スプー Sdbf-zDc6)2016/07/07(木) 08:21:06.48ID:8Wdaz3Psd
isEmptyが{get}なのと同じだろう。
そういう抽象化ってだけだ。
[0]や[count-1]のgetは[1]や[2]などに比べてわざわざ抽象化したいぐらい利用頻度が高いけど、setの場合はそうではないから抽象化がされていない。
必要性が低い操作を作らないのは、直交性と疎結合を守るために大事なことだよ。
0290デフォルトの名無しさん (ブーイモ MM9f-oo3f)2016/07/07(木) 08:31:54.39ID:ls5vBuF8M
すでに用途が明確ならsetterを用意するなんて考えもしなかったってこともあるだろうけど、
ユーティリティクラスのAPI設計者なら、getter作った時点でsetterどうしようかなって普通は考えるだろ。
そのときに何らかの意図や判断があってsetter外したのだと思うのだけど、単にgetter用意しただけで納得できるとか、普段から何も考えてないとしか思えん。
0291デフォルトの名無しさん (ブーイモ MM9f-oo3f)2016/07/07(木) 08:41:15.17ID:y9gRN/nxM
一部話が噛み合ってないようだが、getterしかないプロパティ、setterしかないプロパティなんておかしい、なんて誰も主張してない(たぶん)。
あくまでlastがどう意図でRead Onlyになったのか知りたいだけ。
0292デフォルトの名無しさん (ワッチョイ ef4e-bT3c)2016/07/07(木) 08:43:45.84ID:Y6ZZl/xS0
インデックスでアクセスすると範囲外エラーになり得るから、
よく使うfirstとlastにはnilを返すgetterがある。
0293デフォルトの名無しさん (ワッチョイ 4720-zDc6)2016/07/07(木) 08:55:53.91ID:SN7TGrpx0
>>291
ここで喚いても答えなんてわからんだろ
生みの親に直接聞いてこいよ
0294デフォルトの名無しさん (アウアウ Saff-7VFp)2016/07/07(木) 10:08:20.85ID:OAHH8Qcfa
配列のfirstやlastは、配列要素の追加や削除を行うルーブの中で使用したり、配列からFILOのスタック構造とか、FIFOのキューなんかを設計する場合にすごく便利な
プロパティ(/メソソッド)だけど、firstやlastのセッターの利用が想定される一般的な場面なんてない
それはもうソフトウェア設計者としての根本的なセンスの問題
分かる人はすぐピンとくるし、分からん奴は何で?と思うぐらいの感覚なんだろう

リードオンリーなクラス(/構造体)属性に無闇にセッターはつけるのは全体的なアクセシビリティーのポリシーに関する問題もあるが、もちろん、コンパイル時のコスト、
バイナリーサイズへの影響なども考慮する必要がある。OSが提供する広く使われるライブラリであれば尚のこと極力無駄は省かなければならない

抽象化とはそういうことの積み重ねであって、例えば設計者がベースクラスに付与した属性の微妙なずれが、継承先のクラスや、それに委譲するクラスの全体的なポリシー
に多大な影響を与えることになる。
例えばSwiftの構造体は値型だけどパフォーマンスを考慮してCopy on writeの設計にしてあり、一つのセッターの存在がバイナリー全体に影響を与える

どうせだしついでにセッターもつけとくか的な発想でつけるようなものではない
0295デフォルトの名無しさん (アウアウ Saff-7VFp)2016/07/07(木) 10:12:29.03ID:OAHH8Qcfa
あとついでに、構造体の変更メソッドになぜわざわざmutatingをつけないといけないのかも考えてみるとその辺の設計思想に関するヒントになるだろう
属性のちょっとした変更が裏側で与える影響は見た目以上に大きいのだよ
0296デフォルトの名無しさん (ワッチョイ 333c-7VFp)2016/07/07(木) 10:21:00.09ID:TrKbkRd20
>>248,261,273だけど他は俺じゃないからなー
なんか俺一人で暴れてる感じになってたから一応。

>>293
>>291は俺じゃないんだがマジで聞いてみたいわ。イライラする。

明確な答えが出ないってことはみんなこういうの引っかからずに受け入れちゃうんだな。。

あと、多分だけど答え出たかも。
.lastってコンピューテッド・プロパティなんだわ。だからgetしかできない。
setできたとしても配列[count-1]にsetされるわけではなくて”var last”にsetされちゃう。
setter{}に配列[last]へジャンプしてセットするプログラムを書くこともできるかもしれないけど(できない?)面倒だから作ってないんじゃないかな。
、、と自分がスッキリするためにこじつけた
0297デフォルトの名無しさん (ワッチョイ 333c-7VFp)2016/07/07(木) 10:27:08.84ID:TrKbkRd20
>>294,295
悪い、書いてる間に更新されてて見てなかった。
そういう感じなんだろうなと思って考えてたけど、そこまで詳しくないから俺にはその路線では解に到達できなかったよ。
0298デフォルトの名無しさん (オイコラミネオ MM3f-zDc6)2016/07/07(木) 10:30:22.32ID:Jhs3qZTiM
https://forums.developer.apple.com/community/xcode/swift
聞いてきなよ
0299デフォルトの名無しさん (スプー Sdbf-zDc6)2016/07/07(木) 11:45:22.91ID:8Wdaz3Psd
>>291
readonlyにする理由やsetterを付けない理由があるわけじゃない。
setterを付ける理由が無いんだよ。
0300デフォルトの名無しさん (ワッチョイ 333c-7VFp)2016/07/07(木) 11:58:28.99ID:TrKbkRd20
>>299
言うていい?
配列の最初と最後って結構弄ること多くないか?俺だけ?
まあもう俺は腹に落としたからいいんだけど。
0301デフォルトの名無しさん (スプー Sdbf-zDc6)2016/07/07(木) 12:11:22.45ID:8Wdaz3Psd
>>300
配列の最初と最後が他の要素に比べて差し替えることが多いとは思えない
配列というデータ構造を選んだ時点でランダムアクセスの機能を必要としてるんだから
最後を差し替えことが多いならstackを、最初を差し替えることが多いならqueueを使うべきだね
0302デフォルトの名無しさん (ワッチョイ c35b-oo3f)2016/07/07(木) 12:18:17.48ID:VBlRVTQq0
last に nil を set する場合、last を削除するのか、配列の長さを 0 にするのか、はたまたなにもしないのか
特に初学者にとって直感的でない動作になってしまうんではないかな
0303デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 12:19:00.86ID:XegmBRIM0
多い少ないの問題じゃない
何度か言ってるけどlastが因→果の一方向のAPIだからってただそれだけや
結果から逆算するようなAPIは、APIデザインの一般論として普通やらない

てかまずlastというAPIの意図を理解できてないと思われる
ただ[count-1]の値を変更することが、last {get} に対する対象な操作であるということがまず自明ではない

「最後の要素を変更するショートカットAPI」を新たに付け加えるとしても、現状のlast { get }に対するlast { set }にするのではなく、別の新しいchangeLastItemメソッドなりにするべき
0304デフォルトの名無しさん (ササクッテロ Sp1f-KEJA)2016/07/07(木) 12:44:46.38ID:AxQVBhdqp
>>302
ちょっとズレてる
原因ありきではなくて目的ありきなんだよ
そもそもfirstやlastにセッターとして利用は想定されていない
0305デフォルトの名無しさん (ワッチョイ d310-GJIm)2016/07/07(木) 13:09:49.85ID:q0aQglkO0
>>300
どんなケース?
配列の先頭や末尾を削除したり、それぞれの先にさらにもう一つ要素を付けるというのはよくあるけど、単純に要素を置き換えるというケースは個人的にはあんまり遭遇しないなぁ。
それか、置き換えるなら先頭、末尾に限らずどこも置き換える感じになるんだよなぁ。
0306デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 13:26:01.08ID:XegmBRIM0
>>304
別にずれてないっしょ
別の見方、経路で説明してくれてるだけ
本来一方向だから、無理矢理セッター側を考えるとおかしなことになるよっていう具体的な指摘
0307デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 13:42:38.73ID:GsSIn1Kea
配列の最後の要素にnil入れたら配列の長さが0になるかもという発想は理解できない
0308デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 13:47:14.09ID:GsSIn1Kea
配列の要素がオプショナル型なら値として普通にnilも受け入れるわけで、配列の最後の要素にnil入れたら削除するかもという発想もちょっとナンセンスだな
0309デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 13:59:51.41ID:XegmBRIM0
>>307,308
順番が違う

lastは「最後の要素を返す、ただし配列が空ならnilを返す」プロパティ
これを逆にセッターとしてまじめに実装するなら「最後の要素を(右辺値)にする、ただし(右辺値)がnilなら配列を空にする」でなくてはならない
これはおかしい

では気を利かせて「ただし(右辺値)がnilなら何もしない」or「…nilなら削除する」とでもするか?
そうするとAPIの一貫性、対称性を破壊するし、「気を利かせた」部分の「何もしない」や「削除する」という動作が非常に予想し難くなる

なぜこういう困難が発生するかといえば、つまるところlastというAPIが因→果の一方向のread onlyなAPIとして意図されているからである

こういうことを>>302は指摘してくれてる
0310デフォルトの名無しさん (ワッチョイ ef4e-bT3c)2016/07/07(木) 14:09:48.71ID:Y6ZZl/xS0
もしsetterを作るならlastだけじゃわからない。
replaceLastかappend/addだろ。
firstならreplaceFirstかinsertFirstになる。
どちらも、配列が空でも最初/最後の要素にセットされるようにすればいい。
「last」だけってことにはならない。
0311デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 14:14:25.91ID:GsSIn1Kea
>>309
「最後の要素を(右辺値)にする、ただし(右辺値)がnilなら配列を空にする」でなくてはならない

だからこの発想がおかしくない?

lastがnilを返すのは配列が空の場合だけじゃなくて、配列の最後の要素がnilの場合も当然nilを返す
だから、nilの代入 = 配列を空にする って想定がナンセンス

そもそもremoveLast()ってメソッドもあるのに
0312デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 14:24:16.41ID:XegmBRIM0
>>311
>lastがnilを返すのは配列が空の場合だけじゃなくて、配列の最後の要素がnilの場合も当然nilを返す

ちがうぞ

var a: [Int?] = [1,2,3,nil]
print(a.last) // Optional(nil)
a = []
print(a.last) // nil

最後の要素がnilの場合、nilではなく入れ子のnilを返す


>そもそもremoveLast()ってメソッドもあるのに
だから議論の順番が違う
0313デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 14:42:40.56ID:GsSIn1Kea
オプショナルだろうが直値のnilだろうが

a[a.count-1] = nil

ってやってnilを代入できるだろ

a.last = nil なら配列を空にしようって発想は俺にはないな
0314デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 14:55:50.57ID:XegmBRIM0
>a.last = nil なら配列を空にしようって発想は俺にはないな
だから議論の順番が違うって言ってんだろ
無理矢理セッターを作ったらどんな奇妙なことになるかって話をしてるんだから

>a[a.count-1] = nil
>ってやってnilを代入できるだろ
それも論点がズレてんぞ
lastのセッターがもしあるならという想定で a[a.count-1] = nil と同等なのは、a.last = .some(nil) であり、 a.last = nil ではありません
[Int?]の場合lastの型はInt??です

議論の流れをつかめないうえにOptionalの理解もあやふやみたいだから、言ってもどうせ理解できんのだろうけど…
0315デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 15:11:50.38ID:GsSIn1Kea
lastに強引にセッターを設けるなら、a.last = nil の挙動は素直に、a[a.count-1] = nilと同等にとるのが
普通の感覚だろうと俺は思うんだけど、そこに、やれその場合は配列を空にしようとか、要素を削除しようとか
の想定をして話を奇妙にしてるから、俺はそのことを>>302にレスしたんだけど
横から勝手に君が>>302の代弁を始めたんじゃん
そもそも>>302の本心なんて、>>302じゃない君にはわからんだろうと思うんだけど、そこも俺には奇妙だよ

実際、君の例のaの要素にnilを代入する場合は、a[3] = nil でオッケーなんだし
シンプルに考えればいいんじゃねと思うけどね
ま、なんにせよlastのセッターはいらんけどね
俺も君と議論するんじゃなくて、>>302のレスが聞きたいよ
0316デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 15:43:26.22ID:XegmBRIM0
>>315
それは普通の感覚じゃなくてOptionalをよく分かってない人の感覚
さらっとむちゃくちゃなOptionalの剥がし方を要求してる


>>302の考えを勝手に代弁するかたちになったのは、>>302に対してもごめんなさい
自分の考えを(あてこすって)勝手に述べただけでした
0317デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 16:31:52.75ID:GsSIn1Kea
仮に強引にlastにセッターを設けたとして

var a:Array<Int?> = [10, 20, 30]

こういう配列の最後の要素にlastを使って別の値を設定する場合、
例えば、100なら、

a.last = 100

となるだろう
では、nilを代入したい場合は?

a.last = nil

と書くことを想定するのが自然だと思わない? lastの返却値はオプショナル型だけど、この代入でオプショナル型の無茶苦茶な剥がし方をしてるなんて感覚はない
それ以外にどう書くの?
a.last = nilで配列を空にしようとか、要素を削除しようなんて発想は出てきにくいと思うけどね

var b: Int??
b = 100
print(b! == 100) // true
print(b!! == 100) // true
0318デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 16:48:44.78ID:GsSIn1Kea
これは、Swiftの配列がnilを要素に取りうることを理解していれば自然に湧き出てくる感覚であって
Dictionaryの場合は、キーがnilの要素は受け付けない(キーはHashableプロトコルに適合していることが条件なので)ので、nilの代入で要素の削除というのはすんなり受け入れられる
0319デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 17:09:56.93ID:XegmBRIM0
// 現状のlastのセッター側を「あえて」実装する場合の、論理的に最も素直な実装
extension Array {
var myLast: Element? {
get {
// 空ならnilを返す
return count == 0 ? nil : self[count - 1]
}
set {
if let newValue = newValue {
self[count - 1] = newValue
} else {
// nil なら配列を空にする
self.removeAll()
}
}
}
}
0320デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 17:10:45.49ID:XegmBRIM0
var a: [Int?] = [1,2,3]

a.myLast = 4
print(a) // [Optional(1), Optional(2), Optional(4)]
print(a.last) // Optional(Optional(4))

a.myLast = .some(nil)
print(a) //[Optional(1), Optional(2), nil]
print(a.last) // Optional(nil)

a.myLast = nil
print(a) // []
print(a.last) // nil

var b: [Int] = [1,2,3]

b.myLast = 4
print(b) // [1,2,4]
print(b.last) // 4

b.myLast = nil
print(b) // []
print(b.last) // nil

見て分かる通り、セッター側とゲッター側で対応が取れており一貫性がある
0321デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 17:11:22.27ID:XegmBRIM0
逆にお前の「自然な想定」ではこの(1)〜(5)でどうなるわけ?

var a: [Int?] = [1,2,3]
a.last = 4 // (1)
a.last = .some(nil) //(2)
a.last = nil // (3)

var b: [Int] = [1,2,3]
b.last = 4 // (4)
b.last = nil // (5)
0322デフォルトの名無しさん (アウアウ Saff-xV+3)2016/07/07(木) 18:18:31.26ID:KmYG+hkAa
.some(nil)ってのはどっからもってきたのかしらんけど
俺の想定では、(2)と(3)はどちらもnil設定、(5)は実行時例外もしくはコンパイルエラーだよ
少なくとも(3)、(5)で配列のクリアは感覚的にありえない
ゲッタが空の配列からnilを返すから、nilの代入なら空にするということに一貫性があるとは思えないし、そういう発想もない
0323デフォルトの名無しさん (ワッチョイ 333c-7VFp)2016/07/07(木) 19:05:21.61ID:TrKbkRd20
>>319
まあ、ミスっただけだとは思うが最後の”nilなら配列を空にする”ってのはおかしいな。
nilでも最後尾のエレメントがあるところに代入しないといけない。
nil代入できない場合はXcodeがエラー出してくれるからif let 自体いらないと思う。
lastと[count-1]は同じ動作じゃないとおかしい。
0324デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 19:09:15.66ID:XegmBRIM0
>>322
>.some(nil)ってのはどっからもってきたのかしらんけど
話にならんなぁ
ちゃんと意味のある外側のOptionalを無視しようとしてるから、.some(nil)はどっから持ってきたのとか言っちゃう

var a:[Int?] = [1,2,nil]
var b:[Int?] = []
このとき a.last と b.last には何が入ってる?
a.last == nil は true になるか?

>>323
お前もかw
もっと勉強しろ


あと感覚的にnilで空にするべきなんて一言も言ってないだろ
getの挙動から論理的に帰納するなら、nilで空になるべきではないかって言ってんだよ
そしてそれが奇妙に思えるっていうお前の感覚には別に反論してないよ
でも、少なくとも a.last = nil と a[a.count-1] = nil が同等であるべきという素人考えは受け入れられないわ、というだけ
ほんとすぐに議論を見失うやつだなあ
0325デフォルトの名無しさん (ワッチョイ 333c-7VFp)2016/07/07(木) 19:11:08.47ID:TrKbkRd20
>>301
ごめんちょっと理解できない。
・配列=ランダムアクセエスって何で?
・stack/queueって何ですの?
0326デフォルトの名無しさん (ワッチョイ 333c-7VFp)2016/07/07(木) 19:14:36.22ID:TrKbkRd20
>>324
ごめん意味わかった!
でもそれ[count-1]でやった時どうなるんだっけ?
0327デフォルトの名無しさん (ワッチョイ 333c-7VFp)2016/07/07(木) 19:29:35.63ID:TrKbkRd20
>>324
やってみた、2つの意味のnilを混同してnilが帰ってきたわ。
まあ、範囲外に代入しようとしたらエラーメッセージ出るし
まだ不都合は感じてないわけだけども。。
0328デフォルトの名無しさん (ササクッテロ Sp1f-xV+3)2016/07/07(木) 20:15:40.77ID:AxQVBhdqp
>>324
.some(nil) が、配列の要素のオプショナル型にnilが入ったものだってのは分かってるけど、それを擬似コードじゃなくて
コンパイルが通る具体的なコードで示してほしかったって意味で、「どっから持ってきたのかしらん」ってかいた。
会話がかみ合わないなw それとも俺がオプショナルを理解してないことにしたいのか

そもそもの話の発端は、>>302が、lastにセッターを設けると、nilの代入で配列を空にすることが実装の候補になりうるという話だったから、俺はそれはずれてるし奇妙だと言った。
そして君は、それは感覚がおかしいといい、空の配列からnilが返るなら、nilの代入で配列を空にするのが一貫性があるといい、今度は、俺がnilの代入で空にすることをおかしいと思う感覚には別に反論しないという。
論点と主張がずれてきてんのは君の方だよ。あと言葉遣いも
0329デフォルトの名無しさん (スプー Sdbf-zDc6)2016/07/07(木) 21:27:10.05ID:8Wdaz3Psd
>>325
予想外。これが理解出来ないって言われたら、配列型として備えるべき最低限の機能について話すことなんかできないわな。
0330デフォルトの名無しさん (スプー Sdbf-zDc6)2016/07/07(木) 21:29:14.04ID:8Wdaz3Psd
a.last == a[a.count-1]はtrueになるの?
0331デフォルトの名無しさん (ワッチョイ c7c9-7VFp)2016/07/07(木) 21:56:35.50ID:XegmBRIM0
>>328
まだやんのw

擬似コードじゃなくてコンパイル通るコードしか示してないぞ
.some(nil)の書き方は3.0のもので2.xでは大文字の.Some(nil)だけど修正する箇所はそこだけで3.0でも2.xでも通るはず

>>320だけちょっとミスってたけどコード中の
print(a.last)、print(b.last)はぜんぶ
print(a.myLast)、print(b.myLast)で、setしたものとその後にgetしたものを比較する意図だった
(コンパイルも通るし、getの中身はlastもmyLastも同じなので結果も変わらない)

たぶん咬み合わない理由は、俺は論理的こうあるべきということと、直感からこうあってほしいということをずっと分けて考えてるけど
あんたはこの2つをごっちゃにしてる、というか直感で設計するということしか考えてなさそうなことと
あと >>308 の時点からずっと、配列の要素がOptionalの場合に、要素として入ってるnil、lastから返されるnil、lastから返される.some(nil)、の3種類のnilをごっちゃにしてたっぽいこと(否定するんだろうけど)なんだろうな

ということで俺の中で決着ついたから俺はもういいわw
0332デフォルトの名無しさん (ササクッテロ Sp1f-xV+3)2016/07/07(木) 23:31:04.62ID:AxQVBhdqp
>>331
.Some(nil)という書き方は知らなかった。てっきり擬似コードかと..すまない。

言いたいことはわかった。まぁ俺が感覚だけに頼った希望的意見だけ述べてたんだろう。その点も謝る。>>302もそういう観点から言ったのだとしたら同じく謝るよ。
まぁそれでも、空の配列からnilが返るからnilの代入で配列を空にしようという発想が受け入れられないという、lastプロパティのコンテキストを無視した論理的でない直感的な主張は曲げれないんだけど。

あ、俺ももういいからレスはいらないよ


>>330
a.lastは配列の最後の要素のオプショナル型を返す。配列が空ならnilを返す。
a[a.count-1]は配列の最後の要素を返す。配列が空なら例外を投げる。
型が違うから両者の == 比較はtrueにはならない。
0333デフォルトの名無しさん (ワッチョイ dbd4-zDc6)2016/07/08(金) 01:00:36.86ID:M2+Y2VsA0
>>332
比較演算子は自動unwrapされると聞いたが、二重optionalの場合はどうなるんだ?
0334デフォルトの名無しさん (ササクッテロ Sp1f-cFDw)2016/07/08(金) 02:40:48.84ID:YUHkqKpPp
池沼しかいないのかよ
分かってるんなら分かりやすく完結におしえてやれよな
それができてないから無駄にスレが伸びてるんだぜ?まったく。
0335デフォルトの名無しさん (ササクッテロ Sp1f-cFDw)2016/07/08(金) 09:45:15.60ID:fs/TH3E9p
イクイク
0336デフォルトの名無しさん (アウアウ Saff-7VFp)2016/07/08(金) 10:33:42.65ID:QoN3Vbr1a
今まで.Some(hoge)って意識してなかったけどオプショナルのオプショナルのオプショナルにnil代入するのってどれが正解なんだろ

var a:Int???
var b:Int???
var c:Int???

a = nil // nil
b = .Some(nil) // Optional(nil)
c = .Some(.Some(nil)) // Optional(Optional(nil))

if let x = a { print (x) }
if let y = b { print(y) } // nil
if let z = c { print(z) } // Optional(nil)

bはないだろうけど、cの書き方が正解なんかな。気持ち的にはaだけど
でも下の2つは結果が同じなんだよな

a = 10
if let x = a { print(x) } // Optional(Optional(10))

c = .Some(.Some(10))
if let z = c { print(z) } // Optional(Optional(10))

頭こんがらがってきた
オプショナルの連鎖はほとんど使わないけど、配列が要素になってる配列から、a.last.last.last なんて取り出しかたする時に出てきそうだ
■ このスレッドは過去ログ倉庫に格納されています