map
とか filter
とか簡単に書ける Swift で書けたらすごくうれしい。データの前処理は個人的には学習プログラムを走らせる前に通すので swiftで書いても良い
@t.ae#5802 もうちょっと学習に近いところで、一部のデータをいじったり変換したりフィルタしたりするところのイメージ。images = augmentation(images)
みたいにやってるlet tensor: Tensor<N, 480, 640, 4> = ...
-1
は Swift 的に微妙では。せめて nil
だと思う。let tensor: Tensor<nil, 480, 640, 4> = ...
↑この方がいいかな。T<10, 480, 640, 4>
とかを代入するんですよね?transpose
とかでゴリゴリ入れ替えたりしてると・・・$ gyb --help
A GYB template consists of the following elements: - Literal text which is inserted directly into the output - %% or $$ in literal text, which insert literal '%' and '$' symbols respectively. - Substitutions of the form ${<python-expression>}. The Python expression is converted to a string and the result is inserted into the output. - Python code delimited by %{...}%. Typically used to inject definitions (functions, classes, variable bindings) into the evaluation context of the template. Common indentation is stripped, so you can add as much indentation to the beginning of this code as you like - Lines beginning with optional whitespace followed by a single '%' and Python code. %-lines allow you to nest other constructs inside them. To close a level of nesting, use the "%end" construct. - Lines beginning with optional whitespace and followed by a single '%' and the token "end", which close open constructs in %-lines. Example template: - Hello - %{ x = 42 def succ(a): return a+1 }% I can assure you that ${x} < ${succ(x)} % if int(y) > 7: % for i in range(3): y is greater than seven! % end % else: y is less than or equal to seven % end - The End. - When run with "gyb -Dy=9", the output is - Hello - I can assure you that 42 < 43 y is greater than seven! y is greater than seven! y is greater than seven! - The End. - '''
やさしい(やさしくない(やさしい))
(edited)continue
とか break
がうまくいかないんだけどどうすればいいかわかります?if
で分岐しかしてないからやったことないや。% for x in xs: % if x == 0: % continue % end ... % end
%
以下のところのコードは Python だということです。% { } %
の中なら break
や continue
できるけど、それだと間でコード生成できず・・・continue
できなくて if
で全体囲んでるからネストが辛い・・・。"""
によって、 Swift コードとして有効な gyb 的なものが作れないだろうか?if __children__[0].execute(__context__): break
になるようにしておいて、 continue
→ return False
, break
→ return True
に変換すればいいかな。 (edited)return
に変換するってそういうことかfor ... else
あるからきちんとやるならもっと複雑になりそう。extension
を用意して prefix func +(string: String) { print(string) }
for n in 1...20 { let inTypes = (1...n).map { "T\($0)" } let commaSeparated = inTypes.joined(separator: ", ") let arrowSeparated = inTypes.map { "(\($0))" }.joined(separator: " -> ") let nestedClosuresBegin = inTypes.map { "{ \($0.lowercased()) in " }.joined() let nestedClosuresEnd = (1...n).map { _ in " }" }.joined() +""" public func curry<\(commaSeparated), R>(_ f: @escaping (\(commaSeparated)) -> R) -> \(arrowSeparated) -> R { return \(nestedClosuresBegin)f(\(commaSeparated.lowercased()))\(nestedClosuresEnd) } """ }
public func curry<T1, R>(_ f: @escaping (T1) -> R) -> (T1) -> R { return { t1 in f(t1) } } public func curry<T1, T2, R>(_ f: @escaping (T1, T2) -> R) -> (T1) -> (T2) -> R { return { t1 in { t2 in f(t1, t2) } } } public func curry<T1, T2, T3, R>(_ f: @escaping (T1, T2, T3) -> R) -> (T1) -> (T2) -> (T3) -> R { return { t1 in { t2 in { t3 in f(t1, t2, t3) } } } } public func curry<T1, T2, T3, T4, R>(_ f: @escaping (T1, T2, T3, T4) -> R) -> (T1) -> (T2) -> (T3) -> (T4) -> R { return { t1 in { t2 in { t3 in { t4 in f(t1, t2, t3, t4) } } } } }
print
って書くのは面倒だけど+""" """
>""" """
とかのほうがそれっぽい気がする (edited)prefix operator
を作成しないといけない。+""" <html> ... <table> """ for user in users { +""" <tr> <th>\(user.id)</th> <td>\(user.name)</td> </tr> """ } +""" </table> ... </html> """
(edited)>
作ってもいいかも。users
さえ定義してやれば↑動いた。<html> ... <table> <tr> <th>123</th> <td>Chris Lattner</td> </tr> <tr> <th>456</th> <td>John McCall</td> </tr> </table> ... </html>
(edited)"""
はうれしいなぁ。 Swift 5 で async/await
も入ったらめちゃくちゃ使いやすい言語になりそうだ・・・。"""
はインデントとか改行とかよく考えられてるのもうれしい。blacklist
/ whitelist
という用語が人種を「連想させる可能性」があるから除去する。 https://github.com/apple/swift/pull/11687$ swift run
便利じゃのうImportant Use UIKit classes only from your app’s main thread or main dispatch queue, unless otherwise indicated. This restriction particularly applies to classes derived from UIResponder or that involve manipulating your app’s user interface in any way.
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .sound, .alert]) { granted, error in logger.error(error) if !granted { return } // これまで直に呼んで問題なく動いていたがチェッカーに指摘されたので、対応 DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } }
(edited)The main thread checker is a completely new tool in Xcode 9 and it detects violations of some commonly used APIs. And specifically it focuses on UI updates and multithreading. Some APIs require that you only use them from the main thread.
(edited)/Applications/Xcode-beta.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
… Swizzling class: WKWebInspectorWKWebView Swizzling class: WKWebsiteDataStore Swizzling class: WKWebView Swizzled 9839 methods in 324 classes.
みたいな。Process
のドキュメントを見たらcurrentDirectoryPath
がdeprecated
で、ソースを見たら@available
とかなくて、Original sourceを見たらカテゴリで書かれてた… https://developer.apple.com/documentation/foundation/process/1413110-currentdirectorypath
objective-c @interface NSTask (NSDeprecated) @property (nullable, copy) NSString *launchPath; @property (copy) NSString *currentDirectoryPath; // if not set, use current - (void)launch; + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray<NSString *> *)arguments; // convenience; create and launch @end
(edited)typealias Process = NSTask
とか生えてるのかしらSwiftでextensionごとってできましたっけ?
出来ないからSwiftのインターフェイスには反映されていない感じ。class My { } @available(*, unavailable) extension My { func hello() { print("hello") } } My().hello()
コンパイル通るけど何も怒らない- Name: NSTask SwiftName: Process Methods: - Selector: 'launchedTaskWithLaunchPath:arguments:' SwiftName: launchedProcess(launchPath:arguments:) MethodKind: Class - Selector: 'launchedTaskWithExecutableURL:arguments:error:terminationHandler:' SwiftName: run(_:arguments:terminationHandler:) MethodKind: Class - Selector: 'launchAndReturnError:' SwiftName: 'run()' MethodKind: Instance
Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/Foundation.apinotes
に書かれてる。Class Factory Methods If the Swift compiler fails to identify a class factory method, you can use the NS_SWIFT_NAME macro, passing the Swift signature of the initializer to have it imported correctly. For example: + (instancetype)recordWithRPM:(NSUInteger)RPM NS_SWIFT_NAME(init(rpm:)); If the Swift compiler mistakenly identifies a method as a class factory method, you can use the NS_SWIFT_NAME macro, passing the Swift signature of the method to have it imported correctly. For example: + (id)recordWithQuality:(double)quality NS_SWIFT_NAME(record(quality:));
deprecated
とかやめてほしい…@available
として降ってくるのが理想っぽい@interface NSTask (NSDeprecated)
って書くだけではコンパイラは何もしないと思いますね。これはそれぞれのメソッドにdeprecatedのアノテーションがいるはず。[omochi@omochi-iMac swpr]$ cat b.m #import <Foundation/Foundation.h> @interface Cat : NSObject @end @interface Cat (NSDeprecated) - (int)nya; @end @implementation Cat @end int main() { Cat * cat = [[Cat alloc] init]; return cat.nya; } [omochi@omochi-iMac swpr]$ clang -fobjc-arc b.m
@interface NSTask (NSDeprecated) @property (nullable, copy) NSString *launchPath __attribute__((deprecated("..."))); @property (copy) NSString *currentDirectoryPath __attribute__((deprecated("..."))); - (void)launch __attribute__((deprecated("..."))); + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray<NSString *> *)arguments __attribute__((deprecated("..."))); @end
@interface NSValue (NSDeprecated) /* This method is unsafe because it could potentially cause buffer overruns. You should use -getValue:size: instead. */ - (void)getValue:(void *)value; // This method will likely be deprecated in a future release @end
https://developer.apple.com/documentation/foundation/nsvalue/1415141-getvalue?language=objc 見てみるとこっこうあるもんですね。(NSDeprecated)
カテゴリを @available(*, deprecated)
として扱うっていうことですか?@available(*, unavailable) extension My {
これが通るけどnoopなのは書いておくべきだとおもいます。ClangImporterじゃないけど。(NSDeprecated)
カテゴリにも__attribute__((availability(…
があることを前提にしているぽい。 https://github.com/apple/swift/blob/master/test/Inputs/clang-importer-sdk/usr/include/AppKit.h#L49 (edited)UITableView!
だけど実はイニシャライザで付けてるのかなUIView!
か。 override var view: UIView! { didSet { print("aaaa") } }
これ書いたらそのVCに遷移する時にアプリがまるごとハングするようになった。set
と get
が両方用意されてればwillSet呼ばれるか override var view: UIView! { willSet { print("willSet") } }
↓これだとwillSetも呼ばれなくなる override var view: UIView! { willSet { print("willSet") } didSet { print("didSet") } }
class Foo { lazy var bar: Int = 0 } class Foo2: Foo { override var bar: Int { didSet { print("a") } } } Foo2().bar = 2
func foo<T: P>(a: T) -> T.A { fatalError() } struct B {} protocol P {} extension P { typealias A = B }
これがコンパイル通らないのなんでですかね 'T' does not have a member type named 'A'; did you mean 'A'? になる (edited)struct B {} protocol P {} extension P { typealias A = B } func foo<T: P>(a: T) -> T.A { fatalError() }
か func foo<T: P>(a: T) -> T.A { fatalError() } struct B {} protocol P { associatedtype A } extension P { typealias A = B }
にすると通るようになるんですが。。 (edited)extension P { typealias A = B }
これだと、Tに生えてるわけじゃない、のかと思ったけど2番めのは通るのか。Codable
とかではなく一般論として、) JSON でキーが存在しない場合とそのキーに null
が設定されている場合を区別するのってありだと思いますか?{ "foo": null, "bar": 42 }
と { "bar": 42 }
を違うものとして良いか。 (edited)let x: [String: Any] = ["a": 1, "b": Int?.none] let k = x["b"] switch k { case .some(let x): print("some") // here case .none: print("none") }
enum Foo
として設定できるようにしたい、けれども、これまでとの互換性を考えると "foo"
が省略された場合は Foo.hoge
にしたい。でも、セマンティクス上 Foo
がないということも表現したくなったので let foo: Foo?
にしたいって感じです。{"b": null}
も.someになるよという話enum Event { ... }
を作って let event: Event?
というプロパティを足したくなりました。"event"
は存在しなかったので、 "event"
を省略したときは { "event": "doubleTap" }
のように解釈したいということです。 (edited)Event?
が nil
のケースも表現したいので { "event": null }
を "event"
の省略と区別したくなった、と。Event
のnil許可をやめて、enum Event
の中に case none
を入れれば解決すると思うEvent?
だと思うんですよねぇ。Event?
であるべきケースだと思うんですよ。{ "version": 2, "event": null // いべんとがない } { "version": 2, "event": "doubleTap" // ダブルタップ } { "event": null // ダブルタップ }
(edited) "event": "none"
とやるようにするとnull
があいまいでも"none"
が設定されていることは取り出せて"none"
を含むのがあれか、tarunonの言ってる2種類の型の事か"event": null
と "event"
の省略を区別するEvent?
をやめて Event.none
を作る"version"
を足してデコード時に区別するEvent?
に変換する"event": "doubleTap"
を足す)という方法もあるか。case .hoge(let fuga):
ってしてくれるけど、ラベルついてないと case .hoge(_):
ってなってる。 (edited)try
も中がいいのかもしれないけど、 ()
が面倒で結構前に書いてしまいます。case
のときは ()
が元からあるからいいけど。throws
なのかぱっと見でわかんなくなっちゃうんですよね〜。let x = 12 switch ee { case let .a(x, y): print(x, y) default: break }
みたいなときに x が何を指しているのか不安になるので 内側派。Cat
が nil
のときと Cat?
が nil
のときがめちゃくちゃわかりにくくなりそう。public enum Download: ExpressibleByNilLiteral, Equatable { public init(nilLiteral: ()) { self = .noContent } // Simulate download in one step case content(Data) // Simulate download as byte stream case streamContent(data:Data, inChunksOf:Int) // Simulate empty download case noContent }
(edited)let hoge: Hoge? = nil
とかするともう可読性破壊される.some(nil)
とかいう激ヤバなやつもできるlet hoge: Hoge? = nil
のとき hoge
は Hoge?.none
になった。 (not Hoge?.some(nil)
)nil
で表現されてましたよね。今はなくなったけど。そういうのならありな気が。MakeFamily
って何やってるの?ただの join ? 1> ["👩", "👩", "👧", "👧"].joined(separator: "\u{200d}") $R1: String = "👩👩👧👧"
(edited)🐇 🙋 🍇 🍰 name 🔡 🐈 🆕 🍼 name 🔡 🍇🍉 🐖 🌕 🍇 😀 🍪🔤Good night, 🔤 name🍪 🍉 🐖 ☀️ 🍇 😀 🍪🔤Howdy, 🔤 name🍪 🍉 🍉 🏁 🍇 🍦 greeter 🔷🙋🆕 🔤Spencer🔤 🌕 greeter 👴 Prints “Good night, Spencer” to the console 🍉
CircleCIも申請して通ればOSSのmacOSビルドに使えるのね。
問い合わせたらfree OSS Seed plan適用してもらえた。swiftlint
をdockerベースで簡単に実行出来るよう、swiftlint
を含むdockerイメージを作成した。 https://hub.docker.com/r/norionomura/swiftlint/ (edited) linux_swift_4: docker: - image: norionomura/swiftlint:swift-4.0 steps: - checkout - run: swift test - run: mkdir -p build/reports/ - run: swiftlint lint --strict --reporter junit > build/reports/junit.xml - store_test_results: path: build/reports/
状態を持っているものはclass、ステートレスで静的に扱いたいものはstruct
が原則になるかと自分は思ってます。 なお 状態
とは メンバにアクセスした時、返る結果が冪等でなくなる要因
。 つまり、ある型のメンバにアクセスして、その結果が常に同じでないならば、それは「状態を持っている」。 状態は必ずしもプロパティであるとは限らず、も「状態を持っている」といえる。 struct Hoge { var date: Date { return Date() } }
……となると、Hogeはclassであるべきなのか? どうなの? という部分で、ちょっと悩んでしまいまして。 みなさんはどうお考えかなーと聞いてみたくなりました。append
すると count
の返り値が変わりますけど、どっちになります?var date = Date()
でないのは何か理由がありますかvar date = Date()
だと date
が冪等になります (edited)class C { var i: Int = 0 } struct S { private let c = C() var num: Int { c.i += 1; return c.i } } let s = S() // letでimmutableにしてるはずなのに、 print(s.num) // 1 print(s.num) // 2 print(s.num) // 3
structでもimmutabilityを保証できるとは限らないので、 そこも含めて、「mutating以外で冪等性が壊れかねない」意図は classにすることで表現する原則がよさそうかな、と思いましたvar date: Date { return Date() }
は、システムの時計にアクセスしているから結果が変わっているので、参照透明じゃない、外部のステートを参照しているのでステートフル、ということにはなるかとstruct Entry { var name: String var view: XxxView }
みたいに、ほぼタプルとして使う時とか状態を持つか
ベースの世界観で考えると、ViewModelは状態を持つのでclassなんですけど、 共有したいかどうか
ベースのomochiさん世界観ならstructが嵌まるんですねstruct ViewModel { enum State { ... } let state: Variable<State>(.initial) }
VMをstructにするのであれば、みたいなの普通に起こりますね Variableはclassasync / await
が入ったときにちょっとわかりにくいエラーになりそうだなstruct Stone { async mutating func addWeight() { let addValue = await readAddValue() self.weight += addValue } }
type(of: fuga) == Hoge.self
これしか思いつかなかったclass Animal {} class Cat: Animal {} let cat = Cat() cat is Animal type(of: cat) === Animal.self
こうかにゃMirror(reflecting: cat).superclassMirror!.subjectType
これはAnimal.Typeだよfunc f<X: Equatable>(_ x: X) {} f(Int.self) error: TempGround.playground:2:3: error: argument type 'Int.Type' does not conform to expected type 'Equatable'
class Animal {} class Cat: Animal {} class Robot {} func isSubclass<T>(_ object: Any, of: T.Type) -> Bool { return object is T && !(type(of: object) == T.self) } isSubclass(Cat(), of: Animal.self) isSubclass(Animal(), of: Animal.self) isSubclass(Robot(), of: Animal.self)
DispatchQueue.main.async
が ViewModel
の外側でいい気も?
(edited)isSubclass("aaa", of: NSString.self) //true isSubclass("aaa" as NSString, of: String.self) // true
func isSubclass< U: AnyObject, T: AnyObject>(_ object: U, of: T.Type) -> Bool { return object is T && !(type(of: object) == T.self) }
String fuck の対策を入れたぞstatic
にできるものがほとんどな気がする。冪等性が壊れたものを外部から持ち込まない限り mutating
でないあることと冪等性が保たれることはほぼイコールだし。 @omochimetaru の言うように参照型の値を保持する場合くらい?
struct
か class
かとか、普段の #swift でされてる話と変わらないような??
とか使えないのかな #swift? みたいな/Users/sonson/code/2tch.swift/Carthage/Build/iOS/CommonCrypto.framework/Modules/module.modulemap:2:12: error: header '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h' not found header "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h" ^ /Users/sonson/Library/Mobile Documents/com~apple~CloudDocs/code/2tch.swift/Core2ch/CommonCrypto.swift:10:8: error: could not build Objective-C module 'CommonCrypto' import CommonCrypto
/Users/sonson/code/2tch.swift/Carthage/Build/iOS/CommonCrypto.framework/Modules/module.modulemap
ファイルにそのパスが書いてあると思います。/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/
に CommonCrypto.h
はありますか?Module compiled with Swift 4.0 cannot be imported in Swift 4.0.2: /Users/sonson/code/2tch.swift/Carthage/Build/iOS/RealmSwift.framework/Modules/RealmSwift.swiftmodule/arm64.swiftmodule
./Carthage/Build
をプロジェクトの外に置いていると。carthage bootstrap
して、生成された Carthage
ディレクトリをそちらの環境と同じであろう場所に移し、FRAMEWORK_SEARCH_PATHS
が絶対パスで設定されている ので相対パスに直してビルドしました。シミュレータ、デバイスとも問題なくビルドできます。 copy-frameworks
も正しく動いてますね。Carthageのバージョンは 0.26.2
です。Xcodeは9.1で確認しましたが、Xcodeのバージョンが問題ではないと思います。kk/develop
ブランチにPushしておきました。A shell task (/usr/bin/xcrun lipo -remove x86_64 -output /Users/sonson/Library/Developer/Xcode/DerivedData/2tch-bcgusdhndmpkkgftmmvdcpefmgju/Build/Products/Debug-iphoneos/UZTextView.framework.dSYM/Contents/Resources/DWARF/UZTextView /Users/sonson/Library/Developer/Xcode/DerivedData/2tch-bcgusdhndmpkkgftmmvdcpefmgju/Build/Products/Debug-iphoneos/UZTextView.framework.dSYM/Contents/Resources/DWARF/UZTextView) failed with exit code 1: fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: truncated or malformed fat file (offset plus size of cputype (16777223) cpusubtype (3) extends past the end of the file) /Users/sonson/Library/Developer/Xcode/DerivedData/2tch-bcgusdhndmpkkgftmmvdcpefmgju/Build/Products/Debug-iphoneos/UZTextView.framework.dSYM/Contents/Resources/DWARF/UZTextView
こういうエラーが出ますね・・・・・carthage bootstrap --no-use-binaries
でビルドし直してみてください。 carthage update --platform ios --no-use-binaries
これじゃだめ?/usr/bin/xcrun lipo -info /path/to/code/2tch.swift/Carthage/Build/iOS/UZTextView.framework/UZTextView
の結果はどうなりますか?iMac-27-inch-Late-2012:~ sonson$ /usr/bin/xcrun lipo -info /Users/sonson/code/2tch.swift/Carthage/Build/iOS/UZTextView.framework/UZTextView Architectures in the fat file: /Users/sonson/code/2tch.swift/Carthage/Build/iOS/UZTextView.framework/UZTextView are: i386 x86_64 armv7 arm64
VALID_ARCHS="arm64 armv7 armv7s" FRAMEWORKS_FOLDER_PATH=2tch.app/Frameworks TARGET_BUILD_DIR=~/Desktop/ SCRIPT_INPUT_FILE_COUNT=1 SCRIPT_INPUT_FILE_0="/path/to/code/2tch.swift/Carthage/Build/iOS/UZTextView.framework" /usr/local/bin/carthage copy-frameworks
SCRIPT_INPUT_FILE_0
のパスだけそちらの環境に合わせてください。 @sonsonVALID_ARCHS="arm64 armv7 armv7s" FRAMEWORKS_FOLDER_PATH=2tch.app/Frameworks TARGET_BUILD_DIR=~/Desktop/ SCRIPT_INPUT_FILE_COUNT=1 SCRIPT_INPUT_FILE_0="/Users/sonson/code/2tch.swift/Carthage/Build/iOS/UZTextView.framework" /usr/local/bin/carthage copy-frameworks
armv7 arm64
なら正しいですね。で、もしそうだとすると、おかしくなってるところがわからない。copy-frameworks
は正しく動いていて、UZTextView.frameworkも問題なし。/Users/sonson/Desktop/2tch.app/Frameworks/UZTextView.framework iMac-27-inch-Late-2012:UZTextView.framework sonson$ ls Info.plist UZTextView iMac-27-inch-Late-2012:UZTextView.framework sonson$ lipo -info UZTextView Architectures in the fat file: UZTextView are: armv7 arm64
Showing Recent Messages fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: truncated or malformed fat file (offset plus size of cputype (7) cpusubtype (3) extends past the end of the file) /Users/sonson/Library/Developer/Xcode/DerivedData/2tch-bcgusdhndmpkkgftmmvdcpefmgju/Build/Products/Debug-iphonesimulator/Realm.framework.dSYM/Contents/Resources/DWARF/Realm
うわーんwgit submodule
自体には依存バージョン解決の仕組みがないので。#swift<Index>
型が()〜.xcarchive
が1つ上のディレクトリにできてしまう問題を調べててわかったんだけど、xcodebuild archive
の-archivePath
オプションは必ず引数をファイルだと解釈するためで、もともとCarthageでは-archivePath ./
となってて、それだと例えばカレントディレクトリが/Users/katsumi/Desktop/SomeProject/
の場合、-archivePath
オプションの引数は-archivePath /Users/katsumi/Desktop/SomeProject
となってxcodebuild
は/Users/katsumi/Desktop/SomeProject.xcarchive
というファイルを作る、という仕様。~> 0.3
と書いた時の解釈が微妙に違うんだね。0.4
はCarthageだとマッチしないけど、Cocoapodsだとマッチする。from: "0.3.0"
と書いていた場合も 0.4
はマッチする。0.3.x
に限りたい場合、~> 0.3
ではなく ~> 0.3.0
と書かないといけない。~>
ってsemverとかで定義されてる記法?パッケージ管理ソフト独自のもの?~>
を "マイナーバージョンまでは勝手にあげます" という意味に使うか "breaking changeがない限りあげます" とするかは各パッケージマネージャに委ねられるね// 1.5.8 ..< 1.6.0 .package(url: "/SwiftyJSON", .upToNextMinor(from: "1.5.8")),
と書かないといけないぽい。from: "1.3.0"
なら 1.4.0 にもマッチしてほしい (edited)~> 0.3
の意味は普通は 0.3から1.0未満
と考えられるからCocoaPodsがあってると思います。from: "0.3.0"
は 0.4.0 にマッチしてほしくない。~> 0.3.0
と書いて0.3.0以上0.4未満
~> x.3.0
で (x+1).0.0 未満と考えてほしいけど (edited)~>
はRubyGemsの演算子の定義からきているはずなので、それに従うとするならですけど。 (edited)~> 0.3.0
は 0.4.0 未満にしてほしいですねぇ。~>
じゃなくていいんで、 SwiftPM の from: "0.3.0"
については 0.4.0 未満になってほしい。~>
の記号の意味は gems が歴史的に定義しちゃった、とすると、semver準拠の互換性アップデートを表す記法は別に用意したほうがいいですね。4. メジャーバージョンのゼロ(0.y.z)は初期段階の開発用です。いつでも、いかなる変更も起こりうります。この時のパブリックAPIは安定していると考えるべきではありません。
6. パッチバージョン Z (x.y.Z | x > 0)は、後方互換性を保ったバグ修正を取り込んだ場合のみ、上げなければなりません(MUST)。バグ修正とは間違った振る舞いを修正する内部の変更のことを指します。
Q. パブリックAPIに対して後方互換性を保たない、ほんの些細な変更があった際もメジャーバージョンアップをしなければならないのなら、42.0.0のようにバージョンにすぐになってしまわないですか? A. これは責任ある開発と深い洞察のある質問です。多くの依存されているコードを持つソフトウェアにおいて、非互換な変更を気軽に取り込むべきではありません。アップグレードする度にかかるコストは無視できないものでしょう。非互換な変更をリリースするためにメジャーバージョンを上げることは、変更における悪影響を思い知ることになるでしょう、加えて、かかるメリットとデメリットをどちらが大きいか判断すべきでしょう。
x.0.0-alpha.y
とか x.0.0-beta.y
がずっと続くことに。 (edited)9. プレリリースバージョンは、パッチバージョンの直後にハイフンとドットで区切られた識別子を追加することで表現してもよいです(MAY)。識別子は必ずASCII英数字とハイフン[0-9A-Za-z-]でなければなりません(MUST)。識別子は空であってはなりません(MUST NOT)。数値の識別子はゼロからは始めてはなりません(MUST NOT)。プレリリースバージョンは関連する通常のバージョンよりも低い優先度です。プレリリースバージョンは、不安定であり、関連する通常バージョンが示す要件と互換性を満たさない可能性があります。例:1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92。
0.0.x
で公開してたライブラリを0.1.0
にしておこう…~> 1.2.1
として嫌なのは、バグフィックスの関係で1.2.1は絶対必要なんだけど、そうすると上がる範囲が1.2系に限られてしまう。Carthageだと1.yもOKで、僕はこちらの方が好みです。~> 1.2
と書くのではダメなのですか? (edited)glob.h
の glob
、 **
によるディレクトリ再帰には対応してないのか・・・10 ** (10 ** (10 ** 122))
なんかも BigInteger
の限界を突破してしまうんですが、おもしろいのが 10^(10^(10^122)) Mpc = 10^(10^(10^122)) m
https://en.wikipedia.org/wiki/Orders_of_magnitude_(length) となっていることで、メートルだろうが光年だろうがメガパーセクだろうが数が大きすぎて単位が意味を成さないということです。10 ** (10 ** 115))
だけの距離があれば(同じく単位は何でもいい)、確率的には観測可能な宇宙とまったく同じ空間が存在しているという計算があって、この二つを組み合わせるとまったく同じ(可視宇宙と同じ大きさの)空間が無数に存在していることになり、当然ちょっとずつ違う空間も存在していることになり、エヴェレット解釈なんかなくてもありとあらゆる可能性を選択した宇宙が実在するんじゃないかと。and x others
は困らないけど困るand x others
になってしまうgit
コマンドとの概念が違いすぎて困りそう。guard let _self = self else { return }
によってselfがnilになるべきでない場所でも異常状態が握りつぶされるのを避けたい、というのがありますdeinit { DispatchQueue.main.async { [scrollView] in let _ = scrollView } }
(edited)プライバシー>解析>解析データ
これ知らなかった!Initialization of variable 'hoge' was never used; consider replacing with assignment to '_' or removing it
↑ 考えながらコード書いてるときいちいちこれ出てくるの鬱陶しいんですが suppress できないものでしょうかw (edited)let a = hogehoge()
して、さてa
をどうしようか、ってときに警告出るのがウザいってのは_ = 1 + 1
マジだイケた 知らなかった_ =
では解決できない気がするなぁ。let _ = ...
と書いてから _
を考えるのじゃダメですか?
(edited)let hoge = f(x) _ = hoge
これで潰す (edited)a
の名前をどうするか?という意味ではない??let hoge = f(x) let huga = g.bar { // ここで hoge を使おうと思っているがまだ書いていない。
func useAfter(_ x: Any) { _ = x } let hoge = f(x) useAfter(hoge)
(edited)_ = [foo, bar, buz]
みたいに残したいの全部書きましたが@discarableResult
のアトリビュート入れるのもありかなと.
からのメソッド補完や enum型のswitch - case 補完は動くみたいですねenum SomeEnum { case aaa(Int) } let value = SomeEnum.aaa value // (Int) -> SomeEnum
int川.map(SomeEnum.aaa)
みたいな川.map { _ in SomeEnum.aaa }
って書いてて、あとからassocvalue足したらこの行がセグフォで死んだenum My { case aaa(Void) }
(edited)case
は型でないのでまたちょっと違うかも?SomeEnum.a.init(1)
って書けるのかなもしかしてpod lib lint
がgithub.comなurlのvalidationに失敗するぽい。import Foundation func greet(person: String) -> String { let greeting = "Hello, " + person + "!" return greeting } print(greet(person: "Anna")) print(greet(person: "Brian"))
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu Hello, Anna! Hello, Brian!
import Foundation func greet(person: String) -> String { let greeting = "Hello, " + person + "!" return greeting } print(greet(person: "Anna")) print(greet(person: "Brian"))
Swift version 4.0.3 (swift-4.0.3-RELEASE) Target: x86_64-unknown-linux-gnu Hello, Anna! Hello, Brian!
func fibonacci(number: Int) -> Int { if number <= 1 { return number } else { return fibonacci(number: number - 1) + fibonacci(number: number - 2) } } print(fibonacci(number: 10))
2018-03-31-a 4.1 4.0.3 3.1.1 3.0.2
Usage: @swiftbot [--version=SWIFT_VERSION] [--command={swift, swiftc}] [--options=SWIFTC_OPTIONS] @swiftbot versions: show available Swift toolchain versions @swiftbot help: show help
protocol A {} struct S<T> {} struct K: A {} extension S : A where T: A {} print(S<K>.self is A.Type) print(S<S<K>>.self is A.Type) print(S<S<S<K>>>.self is A.Type)
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
true true true
/usercode/main.swift:8:17: warning: 'is' test is always true print(S<K>.self is A.Type) ^ /usercode/main.swift:9:20: warning: 'is' test is always true print(S<S<K>>.self is A.Type) ^ /usercode/main.swift:10:23: warning: 'is' test is always true print(S<S<S<K>>>.self is A.Type) ^
import XCTest class Test: XCTestCase { func testA() { XCTAssertTrue(true) } static var allTests = [("testA", testA)] } XCTMain([testCase(Test.allTests)])
(edited)Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
/usercode/main.swift:4:27: error: heterogeneous collection literal could only be inferred to '[Any]'; add explicit type annotation if this is intentional static var allTests = ["testA", testA] ^~~~~~~~~~~~~~~~ as [Any] /usercode/main.swift:6:10: error: cannot invoke 'testCase' with an argument list of type '([Any])' XCTMain([testCase(Test.allTests)]) ^ /usercode/main.swift:6:10: note: overloads for 'testCase' exist with these partially matching parameter lists: ([(String, (T) -> () throws -> Void)]), ([(String, (T) -> () -> Void)]) XCTMain([testCase(Test.allTests)]) ^
import XCTest class Test: XCTestCase { func testA() { XCTAssertTrue(true) } static var allTests = [("testA", testA)] } XCTMain([testCase(Test.allTests)])
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
Test Suite 'All tests' started at 2018-04-02 03:31:20.701 Test Suite 'bin.xctest' started at 2018-04-02 03:31:20.725 Test Suite 'Test' started at 2018-04-02 03:31:20.725 Test Case 'Test.testA' started at 2018-04-02 03:31:20.725 Test Case 'Test.testA' passed (0.0 seconds) Test Suite 'Test' passed at 2018-04-02 03:31:20.726 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'bin.xctest' passed at 2018-04-02 03:31:20.726 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds Test Suite 'All tests' passed at 2018-04-02 03:31:20.726 Executed 1 test, with 0 failures (0 unexpected) in 0.0 (0.0) seconds
print("`" + "``") print("escape test")
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
``` escape test
と置換して読んで)
bbb bbb bbb
` (edited)print("`" + "``") print("escape test A") print("`" + "``") print("escape test B")
Swift version 4.1 (swift-4.1-RELEASE) Target: x86_64-unknown-linux-gnu
``` escape test A
escape test B ```swiftbot install 2018-04-02-a
みたいにスナップショットをインストールできるとメンテナンスはすごく楽だな。@testable import
のために一緒にENABLE_TESTABILITY=YESも指定してあげる (edited)ENABLE_TESTABILITY=YES
って初見だ- matrix:
で組み合わせ並べられるんだよね。"bash <(curl -s https://codecov.io/bash) -f 'coverage.txt'"
ここらへんが -f 'coverage.txt'
の部分いらないんですけど、どうも64Bitの時にバイナリがうまく見つからないっぽいので、自分でllvm-covを実行してレポートだけ作ってます。[MBProgressHUD showHUDAddedTo:self.view animated:YES];
Future
使ってるんですがdo
はメインのチェーンから外れたものになるんですね。 RxSwiftのdo
に慣れてましたけど完全に副作用だと考えるとこっちのほうが正しそう。 というかRxだとsubscribe
が必要だから副作用を独立に書くことができないのか……do
でthrow
するってのがRxSwiftだとできるけどVaporだとできないってのが↑で言いたかったことでしたpublic func
do(onNext: ((E) throws -> Void)? = nil,
do
はthrowできないのでそれ用のdo
を自分で書いて、でも同名で振る舞いが違うなって思ったのでした。extension EventLoopFuture { public func `do`(_ callback: @escaping (T) throws -> Void) throws -> EventLoopFuture<T> { return map(to: T.self) { t in try callback(t) return t } } }
try
とかの名前にする という結論に落ち着きました。https://www.fabric.io/あかうんと/ios/apps/ばんどるID/dashboard
ここ直うちしたら見れた--compile
のやつ)をswiftファイルに書き込むにはどうすればいいでしょう?--compile
で作られたのは途中のものか… struct A {} extension A: Y {} extension A: Z {}
struct B {} extension B: X {} extension B: Z {}
struct C{} extension C: X {} extension C: Y {}
これをgysbで作るとなると、A、B、C作った後にX、Y、Zを別ファイルで作る必要がありそうだなと思いました (edited)LayoutPropertyCanStoreMiddleToEvaluateFrameType
というプロトコルに対応しているのですが、中身がほぼ同じでちょっとだけ変わってるので、こういうところをメタプログラミングでやりたいUIColor(named: "color-name")!
って書いてた#colorLiteral(red:green:blue:alpha:)
なのが パース中に_ExpressibleByColorLiteral(_colorLiteralRed:green:blue:alpha:)
に変換されて さらに_ColorLiteralTyp(_colorLiteralRed:green:blue:alpha:)
に変換されて SDKによって public typealias _ColorLiteralType = NSColor
か public typealias _ColorLiteralType = UIColor
が適用されて最終的に NS/UIColor(red:green:blue:alpha:)
が使用される感じ? わけが分からない123
が 型推論で Int
になるのと同じ挙動かな?[WIP]
のままマージされてる。 WIP よく使うし、 GitHub は WIP を機能化した方がいい気が・・・。 https://github.com/apple/swift/pull/16983新人iOSエンジニア育成ガイドライン
と題してLTをしたことがあったので、その資料を貼っておきます。 https://speakerdeck.com/d_date/xin-ren-iosenziniayu-cheng-gaidorain 本についてはその当時出ていたものからチョイスしたので、今はもう少し選択肢があるのかもしれませんが、 1冊目はプログラミング経験ゼロ向け(ただしこの本は現在改訂されてません…) 2冊目はプログラミングの経験が多少ある人がiPhoneアプリを作る向け(これは現在も改訂されています) 3冊目はSwiftの文法を深く理解しながら、後ろの方にあるAPI ClientのサンプルをCLIからiOS アプリに組み替えるというのをやってもらいました それぞれの本で習得してもらいたいことも書いておいたので参考にしてください。 その後、こちらから指定した要素を入れたオリジナルのアプリを作ってもらうというカリキュラムでしたが、何を作ってもらったかは覚えていません 本に答えがないものはPRを出してもらって、こちらでレビューしたり、ヒントを与えたりしていました。 ゴールは、作りたいもの、追加したい機能、不具合が出てきたときに、自力で検索して答えを探せる状態を作ることでした。 (edited)b3ce0c9b74d72110d0130f0cd7d4a5cf350b64e3
はswift-5.0-DEVELOPMENT-SNAPSHOT-2018-12-19-a
タグに含まれるのだけど、コミットページに載ってない。GitHubで不具合起きてる? https://github.com/apple/swift/commit/b3ce0c9b74d72110d0130f0cd7d4a5cf350b64e3master
ブランチに含まれるコミットだけ? (edited)Once the commit is on the default branch, any tags that contain the commit will be shown and the default branch will be the only branch listed.
apple-devチャンネルへの招待ですが最近NDAに抵触する話題が全然無くチャンネルほとんど動いてないので招待リクエスト一旦締め切ります また来年NDA話題が出てきたらやりましょう
Social preview Upload an image to customize your repository’s social media preview. Images should be at least 640×320px (1280×640px for best display).
;
のようなものを表す一般的な名前ってありますか?たとえば statement terminator とか。仮に statement terminator として、「 C や Java の statement terminator は ;
ですが、 Python には statement terminator はありません」みたいな言い方ができるようなもの。 (edited)CTExposureDetectionSession
とか、 Core Text とプレフィックス被ってません? https://covid19-static.cdn-apple.com/applications/covid19/current/static/contact-tracing/pdf/ContactTracing-FrameworkDocumentation.pdfomochimetaru#0001
取得のチャンスaaa
nいほんごがきれる ← これですねdiscordapp.com
からdiscord.com
への切り替えを要求されるらしい。 https://twitter.com/discord/status/1257401032189018113 (edited)$ agen "https://www.amazon.co.jp/「早坂愛は防ぎたい」「生徒会は神ってない」「かぐや様は結婚したい」「かぐや様は祝いたい」/dp/B086ZCTDJ8/ref=sr_1_1?__mk_ja_JP=カタカナ&dchild=1&keywords=かぐや様&qid=1588694541&sr=8-1"
出力: Shorten URL: https://www.amazon.co.jp/dp/B086ZCTDJ8 Result has been copied to your clipboard, you can use cmd + v to paste it.
殺す()
もしくは 絶対殺す()
と書いたもの(大凡Auto Layoutの話だと思います、ただ指摘されたツイートの画面しか送ってこないのでそのスレッドに直接飛べませんでしたからAuto Layout以外の技術の可能性もあります、ただしメンション先は全部ダンボーさんなどのエンジニアだけなので間違いなく技術の話です) 2. アニメの実況ツイートでたまたま「殺す」と言うセリフをそのまま呟いてます、ただし該当ツイートは全て 「殺す」
などのように 「」
が必ずついており、加えてアニメのハッシュタグもあります◯す
で伏字にしていたため、指摘されたツイートは全て2018年以前のものです:)
<= これが絵文字になるのもprint((1 ... 100).reduce(0, +)) // 5050
discord.gg/swift
みたいな。swift-developers-japan.github.io
とかだと良さそう。/swift
とか作れそう [発生環境] Xcode 13.5 iOS 15.5 iPhone 13 Pro Simulator [解決したい問題] xxxが表示されない xxxが表示されるようにしたい [発生手順] 1. Aボタンをタップする 2. Bボタンをタップする [コード] コードを見せても問題ない人はリンクは貼ったり、記述したり 最小限で発生するコードだと尚望ましい
(edited)MUTE_DURATION_1_HOUR":"1時間","MUTE_DURATION_3_HOURS":"3 時間","MUTE_DURATION_8_HOURS":"8時間","MUTE_DURATION_24_HOURS":"24時間","MUTE_DURATION_ALWAYS":"ミュート解除するまで","MUTE_UNTIL":"通知オフ期間","MUTED_UNTIL_TIME":"{endTime}まで通知オフ"
ほんとだ!/healthz
は返ってくる。転送量オーバーかな。?v=xxx
みたいなの)だったのでいったんそれを消したら直った。 クエリがあるとJS実行できないみたいな変更がブラウザにあったのかな。直接の原因はともかく理由が全然わからん。extension SwiftUI.Font { static var title2: Self { return .system(size: 22, weight: .bold, design: .default) } } struct ContentView: View { var body: some View { Text("Hello, World!") .font(.title2) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
↑こんな感じで既存の名前と被ったカスタムstatic letがある時、普通にビルドもシミュレーター実行も実機実行も問題ないのに、Xcodeのプレビューだけエラーになってプレビューできないの、コンパイラーのバグに見えますがどうでしょう?
== PREVIEW UPDATE ERROR: CompileDylibError: Failed to build ContentView.swift Compiling failed: ambiguous use of 'title2' /Users/x_shi/Desktop/InlinableTest/InlinableTest/ContentView.swift:22:20: error: ambiguous use of 'title2' .font(.title2) ^ SwiftUI.Font:6:23: note: found this candidate public static let title2: Font ^ /Users/x_shi/Desktop/InlinableTest/InlinableTest/ContentView.swift:13:16: note: found this candidate static var title2: Self {
title2
って既存とかぶるんですか? (edited)@_dynamicReplacement
を使うことで、ContentView
だけ別モジュールに分離されてたりするかも。title2
が Appleの提供するAPIと被ってなかったのか・・・w (edited)title2
が居たと。 (edited).vendor.title2
にはできないかなあ?ここの型解決特殊だから無理かなprint("Hello")
print("Hello")
Hello
@Published
なプロパティ)を更新する形です。 Repositoryはあくまでデータアクセスを抽象化するためのものなので、キャッシュの有無は外から不可知なのが良いかと思います。なので、たとえRepositoryがオンメモリキャッシュを持っていてもStoreに相当するものは必要だと思いますし(Repositoryのキャッシュは状態を扱っているわけではないと思うので)、Store的なものがあればそれをMainActorにすることでUI(ViewまたはViewModel)から同期的にアクセスすることができます。@Published
なプロパティ)を更新する形です。 Repositoryはあくまでデータアクセスを抽象化するためのものなので、キャッシュの有無は外から不可知なのが良いかと思います。なので、たとえRepositoryがオンメモリキャッシュを持っていてもStoreに相当するものは必要だと思いますし(Repositoryのキャッシュは状態を扱っているわけではないと思うので)、Store的なものがあればそれをMainActorにすることでUI(ViewまたはViewModel)から同期的にアクセスすることができます。MainActor
でないと同期的にアクセスできないので、View
が@State
で状態を保持するか、 @MainActor
な ObservableObject
で保持するかということになるかと思います。MainActor
の外に出して非同期に計算する必要はありますが。fetch
するまでは nil
になりますね。ViewModelの @Published
プロパティが nil
の場合、Viewではプレースホルダーを表示したりしてます。.loading
, .loaded(Foo)
, .none
とかに分けてもいいかもしれません。でも、データが存在しない場合は戻り値 nil
をトリガーに「データが存在しません」などのアラートを出してpopとかが多いので、 .loading
と区別する必要なケースがあまりない印象ですね。 (edited)@Published
なプロパティ)を更新する形です。 Repositoryはあくまでデータアクセスを抽象化するためのものなので、キャッシュの有無は外から不可知なのが良いかと思います。なので、たとえRepositoryがオンメモリキャッシュを持っていてもStoreに相当するものは必要だと思いますし(Repositoryのキャッシュは状態を扱っているわけではないと思うので)、Store的なものがあればそれをMainActorにすることでUI(ViewまたはViewModel)から同期的にアクセスすることができます。