Swift part8 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (アウアウ Saaf-caug)
2016/05/13(金) 23:30:06.87ID:MRCJQvHca関連スレ
プログラミング言語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前半分は>>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:sNJzBkxbp0242デフォルトの名無しさん (オイコラミネオ MMb4-oxCW)
2016/06/30(木) 17:46:55.60ID:UTC/JhrUM(iOS Human Interface Guidelinesと照らし合わせてみて)
0243デフォルトの名無しさん (アウアウ Saf6-dfX6)
2016/06/30(木) 17:59:01.00ID:1eFZP5OCa0244デフォルトの名無しさん (ワッチョイ 613c-R7o+)
2016/06/30(木) 21:24:06.00ID:LYDVxhPg00245デフォルトの名無しさん (ワッチョイ 1e93-oxCW)
2016/06/30(木) 22:06:23.41ID:Y+MKvNri00246デフォルトの名無しさん (オイコラミネオ MMb4-oxCW)
2016/07/01(金) 10:42:50.38ID:kTHfiOpEM0247デフォルトの名無しさん (ワッチョイ e0c9-dfX6)
2016/07/01(金) 11:05:47.74ID:iZbsZJ7a0[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例えば 配列.last で最後のやつ弄りたいのにgetオンリーでエラーって誰得?
0249デフォルトの名無しさん (アウアウ Saf6-dfX6)
2016/07/04(月) 02:00:42.87ID:0HQjDP9Aa0250デフォルトの名無しさん (ワッチョイ dd91-s3GQ)
2016/07/04(月) 09:08:10.81ID:/fDVk2WK0俺得なインターフェースが欲しいなら適当にextensionで追加しろ
0251デフォルトの名無しさん (ワッチョイ e0c9-dfX6)
2016/07/04(月) 16:07:03.69ID:tmQPI5vq00252デフォルトの名無しさん (アウアウ Sa25-dfX6)
2016/07/04(月) 16:14:50.13ID:3xy2R967a0253デフォルトの名無しさん (アウウィフ FF25-PhU/)
2016/07/04(月) 16:40:04.39ID:igr6hGQQF0254デフォルトの名無しさん (ワッチョイ 613c-dfX6)
2016/07/04(月) 16:58:30.84ID:luyT0NF10最後尾に追加はappendでしょ
lastって普通最後尾のエレメントを指さないか?
0255デフォルトの名無しさん (ワッチョイ 613c-dfX6)
2016/07/04(月) 21:24:07.43ID:7j/w943c0var 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:/fDVk2WK00257デフォルトの名無しさん (アウアウ 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:+KIX5k5ra0260デフォルトの名無しさん (ワッチョイ e0c9-dfX6)
2016/07/05(火) 00:56:10.26ID:ujdX1xtz0/// 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配列.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配列で置換する場合って、再生成するコストかかるからじゃねーの?
lastだけgetで欲しいのに内部でいちいちコピーされてたら遅くてたまんねーよ。
0264デフォルトの名無しさん (ワッチョイ 613c-dfX6)
2016/07/05(火) 10:51:08.99ID:R42S1A9Q0あれだ、lastってnuallableだからemptyの時の動作が不定になるから・・・とか?
0265デフォルトの名無しさん (アウアウ Sa25-dfX6)
2016/07/05(火) 10:52:33.32ID:hBbm7EY+a0266デフォルトの名無しさん (ワッチョイ e0c9-dfX6)
2016/07/05(火) 11:42:26.00ID:ujdX1xtz0この気持ち悪さが分からんのはセンス無い
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+hda%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:3gyxqmIo00271デフォルトの名無しさん (ササクッテロ Spc9-s3GQ)
2016/07/05(火) 14:13:12.69ID:7+5nTqy/p左辺に式を置く気持ち悪さが先行したぞ
0272デフォルトの名無しさん (スプー Sdb8-txjP)
2016/07/05(火) 20:43:09.63ID:t4nMSGt4da.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は?
0275デフォルトの名無しさん (アウアウ Saf6-dfX6)
2016/07/06(水) 09:25:41.67ID:qN9AduM4a分かってねーのお前だけだから
0276デフォルトの名無しさん (ササクッテロ Spc9-s3GQ)
2016/07/06(水) 10:12:42.12ID:5t5icW6ip俺も昔はその宗教しか知らなかったからな
経験積んだら理解できるようになるぞ、小僧
0277デフォルトの名無しさん (ワッチョイ 1e4e-oxCW)
2016/07/06(水) 10:44:24.11ID:R/PvvFcq00278デフォルトの名無しさん (ササクッテロ Spc9-dfX6)
2016/07/06(水) 11:10:18.22ID:aB9cuo4xphoge.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コレクションによってはオブジェクトの参照で済む場合とコピーが必要になる場合があってifの仕様が統一出来ないから?
0280デフォルトの名無しさん (ササクッテロ Spc9-75Z/)
2016/07/06(水) 11:32:08.44ID:5t5icW6ipObjCにもreadonlyプロパティは大量にあるし、C#やGoの他言語もgetterだけのアクセサあるわけで
逆になんで俺得I/Fをextensionで追加、というのが理解できないのか聞きたい
0281デフォルトの名無しさん (ワッチョイ 9717-oxCW)
2016/07/06(水) 12:10:10.69ID:Dt4/s9Lw0>setできないようにしてるんじゃなくて、getできるようにしただけだからなぁ
ものすごく明快な解答
0282デフォルトの名無しさん (ワッチョイ ddc9-4ceA)
2016/07/06(水) 14:08:08.31ID:MAvTBHdK0NSKeyedArchiverで保存したいんですけど。
どうすればいいですか?
0283デフォルトの名無しさん (アウアウ Saf6-dfX6)
2016/07/06(水) 14:59:44.92ID:rM+MpLbOa0284デフォルトの名無しさん (ササクッテロ Sp1f-cFDw)
2016/07/07(木) 02:42:59.97ID:wKF073iRpextentionで改造してもいいんだけど意味不明な縛りのある言語って、、
やっぱ何らかの理由があると思うんだよなー
0285デフォルトの名無しさん (ワッチョイ 333c-6uh3)
2016/07/07(木) 04:50:54.78ID:iQ3oQoSL00286デフォルトの名無しさん (ササクッテロ Sp1f-oo3f)
2016/07/07(木) 07:32:54.39ID:XlMar3jmpで問題なかろう
数日付き合ったがこの宗教家はダメだな、、、
自分の信仰以外はセンスでの理解を拒否するから
setterが存在しない全てのプロパティになんで?を問いてくる
自分だけは信者じゃないと思ってる信者は怖い
まだ自覚あるアポー信者の方がマシだわ
0287デフォルトの名無しさん (ササクッテロ Sp1f-oo3f)
2016/07/07(木) 07:49:21.83ID:387AC1iypswiftは意識高い系言語だから仕方ないね
0288デフォルトの名無しさん (スプー Sdbf-oo3f)
2016/07/07(木) 08:07:01.67ID:sSwL/NX1dデータバスに接続される物は、必ずしもメモリとは限らないと言う事も当然理解できるであろう。
例えば、タイマが接続されているとして、
書きこみ(=setter)は、パラメータの設定
読み込み(=getter)は、読み出しデータには意味が無く、読み出し行為によって、タイマのリセット
と言う回路が組まれていたとしたら、書き込みに対して、非可逆な動作をする。
これも、理解できないのかな?
0289デフォルトの名無しさん (スプー Sdbf-zDc6)
2016/07/07(木) 08:21:06.48ID:8Wdaz3Psdそういう抽象化ってだけだ。
[0]や[count-1]のgetは[1]や[2]などに比べてわざわざ抽象化したいぐらい利用頻度が高いけど、setの場合はそうではないから抽象化がされていない。
必要性が低い操作を作らないのは、直交性と疎結合を守るために大事なことだよ。
0290デフォルトの名無しさん (ブーイモ MM9f-oo3f)
2016/07/07(木) 08:31:54.39ID:ls5vBuF8MユーティリティクラスのAPI設計者なら、getter作った時点でsetterどうしようかなって普通は考えるだろ。
そのときに何らかの意図や判断があってsetter外したのだと思うのだけど、単にgetter用意しただけで納得できるとか、普段から何も考えてないとしか思えん。
0291デフォルトの名無しさん (ブーイモ MM9f-oo3f)
2016/07/07(木) 08:41:15.17ID:y9gRN/nxMあくまで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ここで喚いても答えなんてわからんだろ
生みの親に直接聞いてこいよ
0294デフォルトの名無しさん (アウアウ Saff-7VFp)
2016/07/07(木) 10:08:20.85ID:OAHH8Qcfaプロパティ(/メソソッド)だけど、firstやlastのセッターの利用が想定される一般的な場面なんてない
それはもうソフトウェア設計者としての根本的なセンスの問題
分かる人はすぐピンとくるし、分からん奴は何で?と思うぐらいの感覚なんだろう
リードオンリーなクラス(/構造体)属性に無闇にセッターはつけるのは全体的なアクセシビリティーのポリシーに関する問題もあるが、もちろん、コンパイル時のコスト、
バイナリーサイズへの影響なども考慮する必要がある。OSが提供する広く使われるライブラリであれば尚のこと極力無駄は省かなければならない
抽象化とはそういうことの積み重ねであって、例えば設計者がベースクラスに付与した属性の微妙なずれが、継承先のクラスや、それに委譲するクラスの全体的なポリシー
に多大な影響を与えることになる。
例えばSwiftの構造体は値型だけどパフォーマンスを考慮してCopy on writeの設計にしてあり、一つのセッターの存在がバイナリー全体に影響を与える
どうせだしついでにセッターもつけとくか的な発想でつけるようなものではない
0295デフォルトの名無しさん (アウアウ Saff-7VFp)
2016/07/07(木) 10:12:29.03ID:OAHH8Qcfa属性のちょっとした変更が裏側で与える影響は見た目以上に大きいのだよ
0296デフォルトの名無しさん (ワッチョイ 333c-7VFp)
2016/07/07(木) 10:21:00.09ID:TrKbkRd20なんか俺一人で暴れてる感じになってたから一応。
>>293
>>291は俺じゃないんだがマジで聞いてみたいわ。イライラする。
明確な答えが出ないってことはみんなこういうの引っかからずに受け入れちゃうんだな。。
あと、多分だけど答え出たかも。
.lastってコンピューテッド・プロパティなんだわ。だからgetしかできない。
setできたとしても配列[count-1]にsetされるわけではなくて”var last”にsetされちゃう。
setter{}に配列[last]へジャンプしてセットするプログラムを書くこともできるかもしれないけど(できない?)面倒だから作ってないんじゃないかな。
、、と自分がスッキリするためにこじつけた
0297デフォルトの名無しさん (ワッチョイ 333c-7VFp)
2016/07/07(木) 10:27:08.84ID:TrKbkRd20悪い、書いてる間に更新されてて見てなかった。
そういう感じなんだろうなと思って考えてたけど、そこまで詳しくないから俺にはその路線では解に到達できなかったよ。
0298デフォルトの名無しさん (オイコラミネオ MM3f-zDc6)
2016/07/07(木) 10:30:22.32ID:Jhs3qZTiM聞いてきなよ
0299デフォルトの名無しさん (スプー Sdbf-zDc6)
2016/07/07(木) 11:45:22.91ID:8Wdaz3Psdreadonlyにする理由やsetterを付けない理由があるわけじゃない。
setterを付ける理由が無いんだよ。
0300デフォルトの名無しさん (ワッチョイ 333c-7VFp)
2016/07/07(木) 11:58:28.99ID:TrKbkRd20言うていい?
配列の最初と最後って結構弄ること多くないか?俺だけ?
まあもう俺は腹に落としたからいいんだけど。
0301デフォルトの名無しさん (スプー Sdbf-zDc6)
2016/07/07(木) 12:11:22.45ID:8Wdaz3Psd配列の最初と最後が他の要素に比べて差し替えることが多いとは思えない
配列というデータ構造を選んだ時点でランダムアクセスの機能を必要としてるんだから
最後を差し替えことが多いならstackを、最初を差し替えることが多いならqueueを使うべきだね
0302デフォルトの名無しさん (ワッチョイ c35b-oo3f)
2016/07/07(木) 12:18:17.48ID:VBlRVTQq0特に初学者にとって直感的でない動作になってしまうんではないかな
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ちょっとズレてる
原因ありきではなくて目的ありきなんだよ
そもそもfirstやlastにセッターとして利用は想定されていない
0305デフォルトの名無しさん (ワッチョイ d310-GJIm)
2016/07/07(木) 13:09:49.85ID:q0aQglkO0どんなケース?
配列の先頭や末尾を削除したり、それぞれの先にさらにもう一つ要素を付けるというのはよくあるけど、単純に要素を置き換えるというケースは個人的にはあんまり遭遇しないなぁ。
それか、置き換えるなら先頭、末尾に限らずどこも置き換える感じになるんだよなぁ。
0306デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 13:26:01.08ID:XegmBRIM0別にずれてないっしょ
別の見方、経路で説明してくれてるだけ
本来一方向だから、無理矢理セッター側を考えるとおかしなことになるよっていう具体的な指摘
0307デフォルトの名無しさん (アウアウ Saff-xV+3)
2016/07/07(木) 13:42:38.73ID:GsSIn1Kea0308デフォルトの名無しさん (アウアウ Saff-xV+3)
2016/07/07(木) 13:47:14.09ID:GsSIn1Kea0309デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 13:59:51.41ID:XegmBRIM0順番が違う
lastは「最後の要素を返す、ただし配列が空ならnilを返す」プロパティ
これを逆にセッターとしてまじめに実装するなら「最後の要素を(右辺値)にする、ただし(右辺値)がnilなら配列を空にする」でなくてはならない
これはおかしい
では気を利かせて「ただし(右辺値)がnilなら何もしない」or「…nilなら削除する」とでもするか?
そうするとAPIの一貫性、対称性を破壊するし、「気を利かせた」部分の「何もしない」や「削除する」という動作が非常に予想し難くなる
なぜこういう困難が発生するかといえば、つまるところlastというAPIが因→果の一方向のread onlyなAPIとして意図されているからである
こういうことを>>302は指摘してくれてる
0310デフォルトの名無しさん (ワッチョイ ef4e-bT3c)
2016/07/07(木) 14:09:48.71ID:Y6ZZl/xS0replaceLastかappend/addだろ。
firstならreplaceFirstかinsertFirstになる。
どちらも、配列が空でも最初/最後の要素にセットされるようにすればいい。
「last」だけってことにはならない。
0311デフォルトの名無しさん (アウアウ Saff-xV+3)
2016/07/07(木) 14:14:25.91ID:GsSIn1Kea「最後の要素を(右辺値)にする、ただし(右辺値)がnilなら配列を空にする」でなくてはならない
だからこの発想がおかしくない?
lastがnilを返すのは配列が空の場合だけじゃなくて、配列の最後の要素がnilの場合も当然nilを返す
だから、nilの代入 = 配列を空にする って想定がナンセンス
そもそもremoveLast()ってメソッドもあるのに
0312デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 14:24:16.41ID:XegmBRIM0>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:GsSIn1Keaa[a.count-1] = nil
ってやってnilを代入できるだろ
a.last = nil なら配列を空にしようって発想は俺にはないな
0314デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 14:55:50.57ID:XegmBRIM0だから議論の順番が違うって言ってんだろ
無理矢理セッターを作ったらどんな奇妙なことになるかって話をしてるんだから
>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普通の感覚だろうと俺は思うんだけど、そこに、やれその場合は配列を空にしようとか、要素を削除しようとか
の想定をして話を奇妙にしてるから、俺はそのことを>>302にレスしたんだけど
横から勝手に君が>>302の代弁を始めたんじゃん
そもそも>>302の本心なんて、>>302じゃない君にはわからんだろうと思うんだけど、そこも俺には奇妙だよ
実際、君の例のaの要素にnilを代入する場合は、a[3] = nil でオッケーなんだし
シンプルに考えればいいんじゃねと思うけどね
ま、なんにせよlastのセッターはいらんけどね
俺も君と議論するんじゃなくて、>>302のレスが聞きたいよ
0316デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 15:43:26.22ID:XegmBRIM0それは普通の感覚じゃなくてOptionalをよく分かってない人の感覚
さらっとむちゃくちゃなOptionalの剥がし方を要求してる
>>302の考えを勝手に代弁するかたちになったのは、>>302に対してもごめんなさい
自分の考えを(あてこすって)勝手に述べただけでした
0317デフォルトの名無しさん (アウアウ Saff-xV+3)
2016/07/07(木) 16:31:52.75ID:GsSIn1Keavar 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:GsSIn1KeaDictionaryの場合は、キーがnilの要素は受け付けない(キーはHashableプロトコルに適合していることが条件なので)ので、nilの代入で要素の削除というのはすんなり受け入れられる
0319デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 17:09:56.93ID:XegmBRIM0extension 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:XegmBRIM0a.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:XegmBRIM0var 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俺の想定では、(2)と(3)はどちらもnil設定、(5)は実行時例外もしくはコンパイルエラーだよ
少なくとも(3)、(5)で配列のクリアは感覚的にありえない
ゲッタが空の配列からnilを返すから、nilの代入なら空にするということに一貫性があるとは思えないし、そういう発想もない
0323デフォルトの名無しさん (ワッチョイ 333c-7VFp)
2016/07/07(木) 19:05:21.61ID:TrKbkRd20まあ、ミスっただけだとは思うが最後の”nilなら配列を空にする”ってのはおかしいな。
nilでも最後尾のエレメントがあるところに代入しないといけない。
nil代入できない場合はXcodeがエラー出してくれるからif let 自体いらないと思う。
lastと[count-1]は同じ動作じゃないとおかしい。
0324デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 19:09:15.66ID:XegmBRIM0>.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ごめんちょっと理解できない。
・配列=ランダムアクセエスって何で?
・stack/queueって何ですの?
0326デフォルトの名無しさん (ワッチョイ 333c-7VFp)
2016/07/07(木) 19:14:36.22ID:TrKbkRd20ごめん意味わかった!
でもそれ[count-1]でやった時どうなるんだっけ?
0327デフォルトの名無しさん (ワッチョイ 333c-7VFp)
2016/07/07(木) 19:29:35.63ID:TrKbkRd20やってみた、2つの意味のnilを混同してnilが帰ってきたわ。
まあ、範囲外に代入しようとしたらエラーメッセージ出るし
まだ不都合は感じてないわけだけども。。
0328デフォルトの名無しさん (ササクッテロ Sp1f-xV+3)
2016/07/07(木) 20:15:40.77ID:AxQVBhdqp.some(nil) が、配列の要素のオプショナル型にnilが入ったものだってのは分かってるけど、それを擬似コードじゃなくて
コンパイルが通る具体的なコードで示してほしかったって意味で、「どっから持ってきたのかしらん」ってかいた。
会話がかみ合わないなw それとも俺がオプショナルを理解してないことにしたいのか
そもそもの話の発端は、>>302が、lastにセッターを設けると、nilの代入で配列を空にすることが実装の候補になりうるという話だったから、俺はそれはずれてるし奇妙だと言った。
そして君は、それは感覚がおかしいといい、空の配列からnilが返るなら、nilの代入で配列を空にするのが一貫性があるといい、今度は、俺がnilの代入で空にすることをおかしいと思う感覚には別に反論しないという。
論点と主張がずれてきてんのは君の方だよ。あと言葉遣いも
0329デフォルトの名無しさん (スプー Sdbf-zDc6)
2016/07/07(木) 21:27:10.05ID:8Wdaz3Psd予想外。これが理解出来ないって言われたら、配列型として備えるべき最低限の機能について話すことなんかできないわな。
0330デフォルトの名無しさん (スプー Sdbf-zDc6)
2016/07/07(木) 21:29:14.04ID:8Wdaz3Psd0331デフォルトの名無しさん (ワッチョイ c7c9-7VFp)
2016/07/07(木) 21:56:35.50ID:XegmBRIM0まだやんの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.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比較演算子は自動unwrapされると聞いたが、二重optionalの場合はどうなるんだ?
0334デフォルトの名無しさん (ササクッテロ Sp1f-cFDw)
2016/07/08(金) 02:40:48.84ID:YUHkqKpPp分かってるんなら分かりやすく完結におしえてやれよな
それができてないから無駄にスレが伸びてるんだぜ?まったく。
0335デフォルトの名無しさん (ササクッテロ Sp1f-cFDw)
2016/07/08(金) 09:45:15.60ID:fs/TH3E9p0336デフォルトの名無しさん (アウアウ Saff-7VFp)
2016/07/08(金) 10:33:42.65ID:QoN3Vbr1avar 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 なんて取り出しかたする時に出てきそうだ
■ このスレッドは過去ログ倉庫に格納されています