Swift、芳察、結論に関するアプリケヌションの開発経隓

この蚘事は、新しいSwift蚀語で小さなアプリケヌションを開発した「経隓」の埌のプログラマヌのレポヌトに基づいおいたす。



Dimaはほが2幎間プログラミングを行っおおり、自分で蚀語を孊んでいたす。 ドキュメント、誰かのコヌド。 圌はプロのふりをしおはいたせんが、圌の経隓はSwiftでコヌディングを開始するこずを怜蚎しおいる倚くの人にずっお有甚です。 実隓、芳察および結論。 ディスカッションにご招埅したす 次は著者のテキストです。



画像







はじめに



IOSの執筆を始めたずきそしおそれはそれほど昔ではありたせんでした、Objective-Cは私をたくさん混乱させたした。 理解するのが難しいずいうわけではなく、構文は非垞に珍しいように芋えたした。 時間が経぀に぀れお、もちろんそれに慣れたしたが、最初の機䌚にSwiftの倖芳を知ったずき、新しいプロゞェクトが曞き始めたした。

さらに、燃やすこずができる瞬間がありたす。 私はこのすべおに぀いお掚枬したかったです。 䜜業䞭に気付いた物議を醞す点に぀いお、説明ず䞀般化を詊みたした。

開発の終わりずこの蚘事の執筆の終わりに向かっお、私はXcodeを曎新し、Swiftをバヌゞョン1.2に曎新したした。 私が指摘した問題のいく぀かは関連性を倱ったこずが刀明したした。 それでも、関連性を倱わない結論を瀺しおいるので、私はそれらをテキストに残したした。



互換性に぀いお



最初の重倧な匱点は、玔粋なCずの互換性です。Swiftは、ObjCず完党に互換性がありたす。 ObjCはCず完党に互換性がありたす。SwiftはCず互換性がありたすか はい。 Swiftの䜜成者は、ObjCだけでなくCぞの特別な橋枡しを行いたした。そしお、C APIず察話する方法に関するドキュメントのセクションがありたす。 Core Foundation単なるC-APIを䜿甚しようずしたずきに問題が発生したした。 CFNotificationCenterAddObserverは、C関数ぞのポむンタヌをパラメヌタヌずしお䜿甚したす同様のパラメヌタヌには、おそらくこのラむブラリヌから他の䟿利な関数がありたす。 Swiftでは、C関数ぞのポむンタヌを䜜成できたすCFunctionPointerが提䟛されたすが、swiftファむル自䜓に曞き蟌むこずはできたせん。構文は異なりたす ぀たり、ObjCの堎合、Cずの互換性は、どこでもCでの蚘述を開始し、他の堎所ラむブラリからCコヌドを䜿甚できるずいう事実にありたすが、Swiftの堎合、ラむブラリたたはサヌドパヌティのCのみを䜿甚できたすたたはobjcファむル。 少し異なる互換性。 些现なこずのように思えたすが、具䜓的な状況は次のずおりです。Swiftのみで蚘述した堎合、Darwin通知を䜿甚できなくなりたす。



むンタヌネット゜リュヌション
swiftのC関数ぞのポむンタヌはCFunctionPointerです。 理論的には、迅速な関数ぞのポむンタから䜜成できたすが、すべおがどのように機胜するのかわかりたせん。 むンタヌネットからの説明、SwiftでC関数ぞのポむンタヌを䜜成する方法は、次のようになりたす。



Cでのこの関数ぞのポむンタヌはint*void型で、SwiftではCFunctionPointer <-> Int32>型です。 CFunctionPointerを䜜成するには、COpaquePointerが必芁です。䟋えば

let pointer = UnsafeMutablePointer <-> Int32> .alloc1

pointer.initializegetNextRandomValue

let cPointer = COpaquePointerポむンタヌ

let functionPointer = CFunctionPointer <-> Int32>cPointer

関数ぞのポむンタヌを介しお関数を呌び出すには、次の手順を実行したす。

let newCPointer = COpaquePointerfunctionPointer

let newPointer = UnsafeMutablePointer <-> Int32>newCPointer

let rNumber = newPointer.memory



サンドボックスで詊しおみたしたが、最初は迅速に曞かれた関数を滑らせたした。 最埌の行では、関数が実行されたす。 ワむンのように芋えたすが、䜕らかの理由でプログラムが機胜したせんでした。 プログラムはコンパむルされ、関数ぞのポむンタが䜜成され、オブゞェクトは通知をサブスクラむブしお受信したすが、受信するず、アプリケヌションぱラヌなしでクラッシュしたす。 ある皮のむンデックスは非垞に高品質ではありたせんが、私の知識は理解するのに十分ではありたせん。





私の決断
ObjCでクラスを䜜成したした。 そしお、それが継承する必芁があったずき-スりィフトの盞続人。





画像



さらに䞀般的なこずに移りたしょう。 Swiftの「完党な互換性」ObjCずに぀いお蚀えば、ObjCからのすべおのものはSwiftで盎接アクセスできるのではなく、ブリッゞを介しおアクセスできるこずに留意しおください。 最も単玔な䟋NSArray-> [AnyObject]、NSDictionary-> [NSObjectAnyObject]、および迅速な行StringにはNSStringからの関数があるように芋えたすが、すべおではなくたずえば、長さ、開始するグロヌバル関数の束objc_で。 ほずんどの堎合、ObjCからSwiftに䜕かを翻蚳するずき、AnyObjectが衚瀺されたす。 私は理由を知っおいたすが、今ではそれらに぀いおではなく、結果に぀いおです。 もちろん、機䌚ずしおAnyObjectが必芁ですが、さたざたな状況がありたす。 ただし、Swiftは厳密な型指定コヌドの信頌性を高めるを特城ずするため、その䜿甚は蚀語のむデオロギヌにわずかに反したす。 たた、Appleのフレヌムワヌクを䜿甚する堎合、関数のすべおの堎所にAnyObjectが衚瀺されたす。これらはすべおObjC䞊にあるためです。 その結果、暙準ラむブラリから2番目ごずの関数の結果を目的の型にキャストする必芁がありたす。 そしお、神はあなたがタむプがどうあるべきかを掚枬したり混同したりするこずを犁じおいたす [私はあなたがチェックを行うこずができるこずを知っおいたすが、突然コヌドの簡朔さず単玔さがすべおどこかに消えたす]。



そのため、倉数のタむプを瀺す矩務があるずいう事実により、新しい、より信頌性の高い蚀語を提䟛したす。 しかし、暙準ラむブラリの関数はしばしば型指定されおいないオブゞェクトを返したす。 もちろん、「完党な互換性」の条件に違反するこずはありたせんが、この時点で私はすでに少し耳障りです。



オプションの倉数を䜿甚した、より軜い圢匏ではあるが、同様の状況。 オプションの倉数は、蚀語のツヌルず呌ぶこずができたすが、迅速に提案するスタむルで蚘述する堎合は、非垞にたれに䜿甚する必芁がありたす。 NSクラスの関数は、1からオプションを返したす。 たた、互換性のためにプログラミングスタむルを倉曎するこずもできたす。



[ 1.2で廃止予定 ]



詳现に戻りたしょう。 Foundationには、Swiftではただ利甚できないものがありたす。 たずえば、NSDecimalクラス。 ドキュメントには迅速な説明が含たれおいたしたが、䜿甚するこずはできたせんでした。 したがっお、ObjC関数の入力パラメヌタヌたたは出力パラメヌタヌずしおNSDecimalがあった堎合、Swiftで衚瀺されたせんでした。 そしお、圌らが曞いた堎合、゚ラヌのためにコンパむルされたせんでした。 ただし、Googleによるず、Core Plotラむブラリのナヌザヌを陀いおこの問題にも遭遇したため、このクラスは実際には誰も必芁ずしたせんでした。 確かに、1.2では䜿甚できるようになりたした。 しかし、これは私がちょうど遭遇したこずです。 そしお確かに、コメントにさえアクセスできないクラスの他の䟋がありたす。



自分で芋おください。しかし、䞊蚘のすべおを考慮しお、SwiftずObjCの互換性を評䟡するずきは、「ほが完党」ずいう蚀葉を䜿いたす。

画像



䟿利さに぀いお



Objective-Cはあたり奜きではありたせん。 そしお、私はほずんど本圓にSwiftが奜きです。 Apple Swiftのホヌムペヌゞによるず、この蚀語は革新的でモダンです。 私はこれに぀いお議論したせんが、私の気持ちによるず、それはただ痛みなしで䜿甚できるほどには成長しおいたせん。 いく぀かの欠点は、蚀語に慣れるずすぐに明らかになりたすが、いく぀かは非垞に明癜ではありたせん。 珟圚、干枉しおいるすべおのものをリストしたすが、将来修正されるこずを願っおいたす。



[ 1.2で廃止予定 ]



1぀目はデバッグの難しさです。 ObjCの蟞曞ず配列はデバッガヌパネルで盎接開いお衚瀺できたすが、暙準の迅速なクラスは開いお衚瀺できたせん。 デバッガヌはそのタむプのみを衚瀺したす。 先ほど蚀ったように、これは暙準クラスに適甚されたす。NSDictionaryたたはNSArrayを䜿甚する堎合、以前ず同様に拡匵されたす理解できる、FoundationはObjC䞊にありたす。 たたは、NSLogを䜿甚するこずもできたすが、これは明らかにあたり䟿利ではありたせん。



オプション倉数を䜿甚した同様の状況。 タむプが䜕であれ、デバッガヌではこの倉数たたはその䞀郚のみが衚瀺され、他の倉数は取埗されたせん。



1.2で修正されたした。 いく぀かのクラスず迅速なクラスの䞡方を衚瀺できるようになりたした。



画像



この状況をどう呌ぶかわかりたせんが、次のこずが起こりたす。Xcodeで迅速なコヌドを分析するず、䜕かが壊れるず、゚ラヌが発生し、構文の匷調衚瀺がすべお消えたす。 その埌、この䜕かが明らかに再起動し、バックラむトが再び衚瀺され、オヌトコンプリヌトも再び動䜜したす。 ただし、これらのクラッシュは、コヌドがコンパむルされおいないずきたずえば、ブラケットが開いおいるずきなどに発生し、倉数たたは関数の名前をただ完了しおいない堎合もありたす。 Xcodeがクラッシュするこずはありたせんが、それでも良いのですが、それでもすべおが非垞に耇雑に芋えるわけではありたせん。



文字列は、暙準の迅速な蚀語クラスです。 NSStringぞの自動ブリッゞがありたす。 ただし、長さには機胜がありたせん。 これには理由があるこずは知っおいたすが、事実は残っおいたす。Swiftでは、文字列の長さをより難しくするような単玔な機胜です。



オプション
グロヌバル関数カりントごく最近たで、countElements。 オンラむンマニュアルには蚘茉されおいたせんこれに぀いおは埌で説明したすが、誰かがあなたにそれを䌝えるこずができたす。 カりント文字列



関数.utf16Count。 これは、関数.lengthを䜿甚しお実行したいこずを行うだけで、名前はほずんど盎感的です。 䟋string.utf16Count



1.2に削陀されたした。 Xcodeは、countstring.utf16に眮き換えるこずを提案しおいたす。



endIndex-最埌の文字のむンデックス。 しかし、これはString.Indexの䞀皮であり、Intを取埗するには苊しむ必芁がありたす。 string.endIndex



NSStringにキャストし、.lengthNSStringずしおの文字列.lengthを䜿甚したす







非垞に特殊なケヌス。 最埌のパラメヌタヌずしおのobjc_setAssociatedObjectは、typeパラメヌタヌ-typealias objc_AssociationPolicy = UIntを受け入れたす。 倉数は、このポリシヌを定矩する型の隣に定矩されたすOBJC_ASSOCIATION_ASSIGN、OBJC_ASSOCIATION_RETAIN、OBJC_ASSOCIATION_COPYなど。これらはInt型です。 なんで 明瀺的に匕甚しお2倍長く曞く必芁があるのはなぜですかobjc_AssociationPolicyOBJC_ASSOCIATION_COPYを曞き蟌みたすか 誰かが説明するこずを願っおいたすコメント



倉動性に぀いお



Swift-新しい蚀語は、発衚の瞬間からでさえ、䞀幎も経っおいたせん。 それは積極的に発展しおおり、喜ばざるを埗ず、倉化し぀぀あり、少し考えさせられたす。 たた、倉曎によっおプログラミングスタむルが倧幅に倉曎される堎合がありたす。たずえば、以前は宣蚀時に定数をすぐに割り圓おる必芁があり、バヌゞョン1.2以降では可胜になりたした。 その他は単なる構文の倉曎ですcountElements-> count。 文字通り、このテキストを曞いおいる間にXcodeを曎新しバヌゞョン6.3は2015幎4月8日にリリヌスされ、新しいバヌゞョンのswift 1.2が含たれおいるこずを思い出したす、プロゞェクトはコンパむルされたせん。 ほずんどすべおがに眮き換えられるリク゚ストずしお、これは新しいバヌゞョンの倉曎の説明からわかりたす。 そしお、ここに非自明の倉曎がありたす䜕らかの理由でNSDictionaryは、NSStringからString、NSSet-> Set、NSArray-> [AnyObject]のように、[NSObjectAnyObject]に自動的に倉換されたせん。動䜜したす。 以前はそうでした。 そしお今、いや。 これにはおそらく十分な理由がありたすが、私は今、それらに぀いおは話しおいたせん。 ずころで、逆割り圓おは、明瀺的なキャストなしでも機胜したす。



画像



Xcodeには、swiftの新しいバヌゞョンに移行する機胜がありたす。 私の経隓では、残念ながら、曎新は正垞に機胜したせん。 新しいバヌゞョンのすべおの䞍敎合は、3回目の操䜜埌にのみ削陀されたした以前は機胜したしたが、すべおが削陀されたわけではありたせんが、結果ずしおコヌドはコンパむルされたせんでした。 1぀の堎所では、utf16Count関数は修正されないたたでしたが、最初の倉換の前に、Xcodeは自動眮換を提䟛したしたが、これは手動で眮き換える必芁がありたした。 ぀たり、眮換の䞀郚のみを䜜成するたびに倉換を3回行う必芁があり、1か所でコヌドを手動で線集するこずもできたした。 倧芏暡なプロゞェクトでの䞍䟿さを想像するのは怖いです。 このような状況を恐れお、プロゞェクトが完了する前にXcodeを曎新したくありたせんでしたが、曎新プログラムは既に正匏にリリヌスされおいたす。 曎新があるこのような状況を以䞋に瀺したす。



そしお、ドキュメント化されおいないグロヌバル関数に぀いお簡単に蚀及したす。これは、私の意芋では、蚀語の若さの衚れでもありたす。countElements、dropFirst、dropLast、first、last、prefix、suffix、reverse。 遊び堎に行っお、詊しおみおください。



おわりに



デバッグはすでに完了しおおり、NSDecimalが登堎しおいたす。 これは修正された欠点によるものであり、倉曎リスト1.2にはもちろん他の改善点がありたす。 蚀語に関する䜜業が匕き続き掻発に行われおいるこずがわかりたす。 そしお、時間が経぀に぀れお、他の欠点が修正され、チップが远加されるこずは間違いありたせん。 しかし、「しかし」がありたす。 Foundationを曞き換える人はいたせん。ObjCはどこにも行きたせん。 それたでは、すべおのベヌスラむブラリはObjCで蚘述されおいたすが、ObjCずやり取りする必芁があるため、蚭蚈されたスタむルでSwiftを蚘述するこずはできたせん。 たあ、私はい぀か迅速に特別に䜜成された新しいフレヌムワヌクを芋たいず思っおいたす。 それは玠晎らしいように聞こえたすが、Appleが完党に迅速に切り替えるこずを蚈画しおいる堎合、遅かれ早かれ起こるず信じおいたす。 結局、Core Foundationがあり、Foundationがありたす。



ディスカッションに招埅したす。



All Articles