[発生環境] Xcode 13.5 iOS 15.5 iPhone 13 Pro Simulator [解決したい問題] xxxが表示されない xxxが表示されるようにしたい [発生手順] 1. Aボタンをタップする 2. Bボタンをタップする [コード] コードを見せても問題ない人はリンクは貼ったり、記述したり 最小限で発生するコードだと尚望ましい
swift test
で走らせないテストの指定ってできないですか? Xcodeだとdisableできるので重宝するのですがswift package generate-xcodeproj
して Xcode 上で実行はダメですか?swift test
もやらないで良いわけじゃないですよね? パフォーマンステスト等機能に直結しないものは走らせたくないという状況です。swift test
を極力しないという方針で回避が良いか。SWIFT_PACKAGE
の存在自体知らなかったです。SWIFT_PACKAGE
定義が含まれているので、それを消した方が良いです。ex
をもつプロトコロルを作成してそれに準拠させるという実装スタイルがあるNonError_1_Contents.swift
とNonError_2_Contents.swift
は associatedtype CompatibleType
と associatedtype CompatibleTyp
になっていますよ。Error_Contents.swift
と同じ状態になります。Error_Contents.swift
において、 extension String: ACompatible { }
から推測される String. associatedtype
の型はAExample<Self>
extension String: BCompatible { }
から推測される String. associatedtype
の型はBExample<Self>
で、型が一致していないのでエラーになりますね。 (edited)Playground execution failed: error: 20170520-221301.xcplaygroundpage:42:1: error: type 'String' does not conform to protocol 'BCompatible' extension String: BCompatible { } // ここで error: type 'String' does not conform to protocol 'BCompatible' が出る 20170520-221301.xcplaygroundpage:24:9: note: protocol requires property 'bEx' with type 'String.CompatibleType' (aka 'AExample<String>'); do you want to add a stub? var bEx: CompatibleType { get } ^ 20170520-221301.xcplaygroundpage:36:9: note: candidate has non-matching type 'BExample<Self>' [with CompatibleType = String.CompatibleType] var bEx: BExample<Self> { ^
class Digest { let str: String init() { str = makeString() } private func makeString() -> String { return "hoge" } }
error: use of 'self' in method call 'makeString' before all stored properties are initialized
private
とはいえ、そこから public
呼べますからね。!!
演算子で明示的にクラッシュケースを書いた場...
class Digest() { val str: String init { str = makeString() } private fun makeString(): String { return "hoge" } }
let
と var
でゼロコストでミュータビリティを変えられる Swift 最強let a = [1,2] // a = [1,2] var b = a; // b = [1,2] b[1] = 3; // a = [1,3] b = [1,3] b.append(5); // a = [1,3] b = [1,3,5] b[1] = 4; // a = [1,3] b = [1,4,5]
class Digest { let str: String init(item: Digest) { str = item.makeString() } func makeString() -> String { return "test" } convenience init() { self.init(item: self) } } print(Digest().str)
完全にだめなやつw convenience init() { self.init(item: self) }
self.init
にself
が渡せるのがもうおかしい気がclass Digest { let str: String let hello: String init(item: Digest) { str = item.makeString() hello = "test" } func makeString() -> String { return hello } convenience init() { self.init(item: self) } } print(Digest().str) // "" <- ?
Foo() 1(75709,0x70000aac2000) malloc: *** error for object 0x6180000129ec: Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug
モダンなSwiftのExtension
ですけど、 UIColor.hoge
は view.backgroundColor = .hoge
できるけど UIColor.ex.hoge
は view.backgroundColor = .ex.hoge
できないってどうなんですかね?func mockFetch() -> Observable<Bool> { return Observable.create { observer in observer.on(.next(true)) observer.on(.completed) return Disposables.create() } }
mockFetch().subscribe(onNext: { _ in print("done") }).disposed(by: disposeBag)
Emits zero elements Emits a completion event, or an error Doesn't share side effects
.subscribe(onComplete: {})
で拾うという手があるかも?ignoreElements
が使えそう<Void>
にして気にしないとかcreate
で書かずに .just でもかけますよ。下請けに本当の非同期処理がある場合は create
ですねdiff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null if [ $? != 0 ] ; then # print error to STDERR echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2 exit 1 fi
platform :ios, '9.0' target 'XXXXX' do pod 'CorePlot', '2.2' pod 'Google-Mobile-Ads-SDK', '7.20.0' pod 'FBSDKCoreKit', '4.23.0' pod 'FBSDKLoginKit', '4.23.0' pod 'FBSDKShareKit', '4.23.0' pod 'Flurry-iOS-SDK/FlurrySDK', '8.1.0' pod 'Fabric', '1.6.11' pod 'TwitterKit', '2.8.1' pod 'TwitterCore', '2.8.0' pod 'Crashlytics', '3.8.4' pod 'SVProgressHUD', '2.1.2' pod 'Realm', '2.7.0' pod 'Repro', '2.4.0' pod 'SwiftLint', '0.19.0' end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['CLANG_WARN_DOCUMENTATION_COMMENTS'] = 'NO' end end end
PODS: - Bolts (1.8.4): - Bolts/AppLinks (= 1.8.4) - Bolts/Tasks (= 1.8.4) - Bolts/AppLinks (1.8.4): - Bolts/Tasks - Bolts/Tasks (1.8.4) - CorePlot (2.2) - Crashlytics (3.8.4): - Fabric (~> 1.6.3) - Fabric (1.6.11) - FBSDKCoreKit (4.23.0): - Bolts (~> 1.7) - FBSDKLoginKit (4.23.0): - FBSDKCoreKit - FBSDKShareKit (4.23.0): - FBSDKCoreKit - Flurry-iOS-SDK/FlurrySDK (8.1.0) - Google-Mobile-Ads-SDK (7.20.0) - Realm (2.7.0): - Realm/Headers (= 2.7.0) - Realm/Headers (2.7.0) - Repro (2.4.0) - SVProgressHUD (2.1.2) - SwiftLint (0.19.0) - TwitterCore (2.8.0): - Fabric - TwitterKit (2.8.1): - TwitterCore (>= 2.8) DEPENDENCIES: - CorePlot (= 2.2) - Crashlytics (= 3.8.4) - Fabric (= 1.6.11) - FBSDKCoreKit (= 4.23.0) - FBSDKLoginKit (= 4.23.0) - FBSDKShareKit (= 4.23.0) - Flurry-iOS-SDK/FlurrySDK (= 8.1.0) - Google-Mobile-Ads-SDK (= 7.20.0) - Realm (= 2.7.0) - Repro (= 2.4.0) - SVProgressHUD (= 2.1.2) - SwiftLint (= 0.19.0) - TwitterCore (= 2.8.0) - TwitterKit (= 2.8.1)
SPEC CHECKSUMS: Bolts: 8a7995239dbe724f9cba2248b766d48b7ebdd322 CorePlot: cbe0c6e14220705e32e06a89c7d6a5a908b7d7d8 Crashlytics: 79e236942ca1e7fc641df1feb9a275360a78ab6a Fabric: 5911403591946b8228ab1c51d98f1d7137e863c6 FBSDKCoreKit: d7829f5a69901cd7296105328e4c3c3fc7da6518 FBSDKLoginKit: 6b92bd65f319d669d2b0730e49db495ef1660566 FBSDKShareKit: 65751c3b9937ab9d594e6c37611ecc115ceeb448 Flurry-iOS-SDK: 51065be4436f3e21fc8d3d7bb0b7d6869df6333d Google-Mobile-Ads-SDK: 168312cdc167fa22746d4ea8e839fc4825dd2966 Realm: 07e5d3a9e0e41d65fd5f9f05150ed6295d0f093b Repro: e69274efa79b1e8f25ec14177356968d9a8e8224 SVProgressHUD: c404a55d78acbeb7ebb78b76d3faf986475a6994 SwiftLint: 3537a05b34060e78e7510f04fb7537d738247803 TwitterCore: e959987be23c767004d29eb7fab8d85d8585a2e5 TwitterKit: 3b6044a7320340326a4098f3e37aa1dbaeb94942 PODFILE CHECKSUM: 47c07dc78a6793f29d1576ffa394f4c5e5b5076e COCOAPODS: 1.2.1
diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null if [ $? != 0 ] ; then # print error to STDERR echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2 exit 1 fi
echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
このメッセージは出て無くて、差分はないと思います。URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil)
で解決しました(この方法だとアプリ全体でキャッシュが効かなくなりますが、画像周りは独自のキャッシュを実装していたので今回は影響がなかったNSAttributedString
で、リンクをタップした際の挙動をSafariを開く挙動から自分で定義した挙動に変更するにはどうしたらいいのでしょうClean Clean build folder Quit Xcode Open Finder then go to ~/Library/Developer/Xcode/DerivedData then deleated everything inside Open Xcode Build
# frozen_string_literal: true # A sample Gemfile source "https://rubygems.org" gem "fastlane" gem 'cocoapods' gem 'cocoapods-keys'
source "https://rubygems.org" gem "cocoapods", '1.2.1' gem "fastlane", '2.11.0'
let storyboard = UIStoryboard(name: "ViewController", bundle: Bundle.main) let vc = storyboard.instantiateInitialViewController() as! ViewController vc.inject([1, 2, 3])
import Instantiate import InstantiateStandard extension ViewController: StoryboardInstantiatable {} let vc = ViewController(with: [1, 2, 3])
ViewController.init(with:)
を 呼ぶことを忘れなければうまくいくけどinject
みたいに「あるメソッドを通過」が外から呼び出すことを意図しているなら、 assert
を書く人と呼び出す人が別な気がするので「assertはいらない」ことにならない気がするんですが・・・。
(edited)@available(*, unavailable, scope: public)
的な (edited)Username for 'https://github.com': omochi Password for 'https://omochi@github.com': remote: Invalid username or password.
Via HTTPS For those checking out sources as read-only, HTTPS works best: git clone https://github.com/apple/swift.git ./swift/utils/update-checkout --clone Via SSH For those who plan on regularly making direct commits, cloning over SSH may provide a better experience (which requires uploading SSH keys to GitHub): git clone git@github.com:apple/swift.git ./swift/utils/update-checkout --clone-with-ssh
import UIKit let numbers = (1...5).map(String.init) print(numbers) // ["1", "2", "3", "4", "5"] var a: [String] = [] // No Error a = Array(numbers.prefix(3)).map { $0 } print(a) // ["1", "2", "3"] // No Error let arraySlice: ArraySlice<String> = numbers.prefix(3) a = arraySlice.map { $0 } print(a) // ["1", "2", "3"] // Error(error: ambiguous use of 'prefix')→ なぜエラーに? // a = numbers.prefix(3).map { $0 }
numbers.prefix(3).map { $0 }
が ambiguous use of 'prefix'
になる理由がわからず。NSImage
を生成して tiffRepresentation
を呼ぶと nil
が返ってきてしまうんですが、解決策をご存知の方はいませんか? 今やっているのは↓で、 let image = NSImage(cgImage: cgImage, size: NSSize.zero) image.tiffRepresentation // nil
この cgImage
は↓のように生成されています。 extension Image where Pixel == RGBA { public var cgImage: CGImage { let length = count * 4 // count == width * height var data = Data(capacity: length) data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer<UInt8>) -> Void in // 略 } let provider: CGDataProvider = CGDataProvider(data: data as CFData)! return CGImage(width: width, height: height, bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: width * 4, space: Image.colorSpace, bitmapInfo: Image.bitmapInfo, provider: provider, decode: nil, shouldInterpolate: false, intent: CGColorRenderingIntent.defaultIntent)! } fileprivate static var colorSpace: CGColorSpace { return CGColorSpaceCreateDeviceRGB() } fileprivate static var bitmapInfo: CGBitmapInfo { return CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.byteOrder32Big.rawValue) } }
tiffRepresentation
のドキュメントには↓のようにありますが、特に PDF や EPS のようなベクター形式の representation にはなっていないと思います。 "if the TIFF data cannot be created" の原因がわからず・・・。 If one of the receiver's image representations does not support the creation of TIFF data natively (PDF and EPS images, for example), this property creates the TIFF data from that representation's cached content. This property contains nil if the TIFF data cannot be created.
https://developer.apple.com/documentation/appkit/nsimage/1519841-tiffrepresentation なお、同様の手法↓で生成されたグレースケールの CGImage
から作られた NSImage
や、 PNG ファイルを読み込んで生成された NSImage
の tiffRepresentation
は正しく動作します。 https://github.com/koher/EasyImagy/blob/05db8c28d034a36cef3a8271d2daa214c8ad5ee4/EasyImagy/ImageCoreGraphics.swift#L133-L147 var data = Data(length: length)
で初期化しないと、capacity
あっても直接イニシャライズすると length
は 0 のままなので。 (edited)init(capacity:)
で生成して、 data.length = length
で拡張するか。← データ突っ込んだ後にやると 0 で初期化されるので注意 (edited)Data.init(count:)
だ。 issue からリンクされているプロジェクトでは NSMutableData
だった。NSMutableData(length:)
で正常に取得できることを確認しました。capacity
とlength/count
は盲点でした…… ポインタと合わせる場合は特に要注意ですねData
の使い方を間違えている可能性をまったく考えませんでした・・・。UIView.animate(withDuration: 1.0, animations: { someView.alpha = 0.0 }) { _ in someView.removeFromSuperview() }
UIView.animate( withDuration: 1.0, animations: { someView.alpha = 0.0 }, completion: { _ in someView.removeFromSuperview() } )
var dict1 = ["May 21": [1,2], "May 22": [3,4]] var dict2 = ["May 22": [5,6], "May 23": [7,8]] dict1.merge(dict2, uniquingKeysWith: +) print(dict1) // ["May 22": [3, 4, 5, 6], "May 23": [7, 8], "May 21": [1, 2]]
Swift Standard Library.playground
とか https://developer.apple.com/documentation/swift ここのドキュメントとか https://developer.apple.com/jp/documentation/a
とか b
とか付けてたので。概念自体は理解できると思いますが、(自然)言語の壁がありそうです・・・。int
が Integer
に[NSValue valueWithInt: 3]
とかやってたけど、 iOS5ぐらいから @(5)
って、アット丸括弧構文でboxingできるようになったとか、昔はあった// Java List<Integer> list = new ArrayList<Integer>(); list.add(new Integer(42)); // boxing
// Java List<Integer> list = new ArrayList<Integer>(); list.add(42); // auto boxing
int
に対して Integer
をラッパークラスと言います。C.self is AnyObject
問題があったから、 Swift の型システムとして表現したい世界と、 ObjC 互換のために現実的にどうなってるかとを区別して考えないといけないかも?struct S{} var s = S() print(type(of: s as AnyObject)) // _SwiftValue var f: () -> Int = { 33 } print(type(of: f as AnyObject)) // _SwiftValue
↑SwiftValueの例#if __OBJC__ @class _SwiftValue; #else typedef struct _SwiftValue _SwiftValue; #endif
#if SWIFT_OBJC_INTEROP
で @interface _SwiftValue : NSObject <NSCopying>
だから is AnyObject
が Mac だと true
になるんだ。 (edited)S.self
でもそのはず?class List<T: AnyObject> {}
これがJavaのListの定義class ArrayList { private Object[] elements; }
こんな風になってたのをclass ArrayList<E> { private E[] elements; }
と書いているだけなので、int[]
とか float[]
みたいな、値型の配列も作れるんだけど、 List<int> のときにそれを内部で使わせる記法も仕組みもない あと、これは鶏卵だけど、ジェネリクスの型パラメータのところに値型が書けない・・・Object
で持ってるのと同じです。コンパイル時に型チェックできるようになっただけで、実行時の挙動はジェネリクス以前と同じで Object
です。List<int>
を導入する話が出てたような?List
は List<Object>
と書いてるのと同じですね。List<Integer> a = new ArrayList<Integer>(); List<String> s = (List<String>)(List<Object>)a;
[Int]() as? [String]
これを嫌がる理由がint foo(List<Integer> list) { ... } int foo(List<Double> list) { ... }
associatedType
?let cell = tableView.dequeueReusableCell(withIdentifier: "hogeCell", for: indexPath) ?? UITableViewCell(style: .subtitle, reuseIdentifier: "hogeCell")
③ その他 ただstyleが違うだけなのにイニシャライザだけ定義した、UITableViewCellのサブクラスつくるのが面倒なので良い方法があったりしないかな…と思った感じです。 (edited)indexPath
を2番目の引数に取る dequeueReusableCell()
はnilを返さないので、2の書き方はindexPath
を取らない方のメソッドを呼ぶ必要があります。細かいツッコミですけど。Frameworks
の下に参照が作られるから、それをEmbedded~へ入れる様にしてる。[Int: Any]
を [String: Any]
にしたいみたいなときってどう書くのが一番綺麗なんでしょうlet source = [1: "1", 2: "2", 3: "3"] Dictionary(uniqueKeysWithValues: source.map { ("\($0.key)", $0.value) })
こう?addSubview(_:)
とremoveFromSuperView()
をしてしまうと、結果としてビューが外された最後の状態でUIが更新されます。download()
は同期的な処理ですか?最も望ましいと思われる解決はdownload()
メソッドを非同期処理にして完了時点でコールバックを受け取れるようにして、addSubview(_:)
を呼んでからdownload()
、ここまでは同じで、removeFromSuperView()
をダウンロード完了のコールバック内で呼ぶことです。addSubview(_:)
の直後に一度イベントループに処理を戻してUIを更新して、download()
、removeFromSuperView()
を呼びます。view.addSubview(uiView) DispatchQueue.main.async { self.download() uiView.removeFromSuperView() }
protocol A { associatedtype TypeA } protocol B { associatedtype TypeB } protocol C: A, B where TypeA == TypeB { } struct Hoge: C { // error: type 'Hoge' does not conform to protocol 'A' typealias Type2 = String }
struct Hoge: C { typealias TypeA = String typealias TypeB = String }
これなら通りますね。TypeAとTypeBが別々だと通らなくなるので同一チェックもされてるようです。typealias
を書かなくてもコンパイルは通ります。 protocol A { associatedtype TypeA func foo() -> TypeA } protocol B { associatedtype TypeB func bar() -> TypeB } protocol C: A, B where TypeA == TypeB { } struct Hoge: C { func foo() -> Int { return 2 } func bar() -> Int { return 3 } }
protocol A { associatedtype TypeA } protocol B { associatedtype TypeB } protocol C: A, B { associatedtype TypeB = TypeA } struct Hoge: C { typealias TypeA = String }
C
のそこ associatedtype
になるんですね。 typealias
で書いてエラーになってあきらめてました。protocol A { associatedtype E } protocol B { associatedtype E } struct C: A, B { typealias A.E = Int typealias B.E = String }
これはどうあがいてもムリです。 (edited)CFNetwork URLResponse::guessMIMETypeCurrent(__CFData const*)
のバグに苦しめられてまして、どなたか同じような現象に出くわした方いらっしゃいませんか。 MIMETypeについてなので、URLResponseをNSHTTPURLResponseにキャストしてMIMETypeの中身を見てるんですが、たまにnullが返ってくるのが問題かなと思ったのですが、iOS10や9でもnullで返ってくるので、特にこれが原因でクラッシュするわけではないような…。 ググっても同じような問題に悩んでいる人が見つからなかった…。 Crashed: com.apple.NSURLSession-work SIGABRT ABORT 0x0000000180ded348 -------------------------------------------- libsystem_kernel.dylib __pthread_kill + 8 CoreFoundation _CFRelease + 1252 CFNetwork URLResponse::guessMIMETypeCurrent(__CFData const*) + 1548 CFNetwork -[__NSCFURLLocalSessionConnection _tick_sniffNow] + 348 libsystem_pthread.dylib start_wqthread + 4
guessMIMETypeCurrent
だからContent-Type
を付け足してみて試すとか。POST / HTTP/1.1 [[ Less interesting headers ... ]] Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150 Content-Length: 834 -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text1" text default -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text2" aωb -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file1"; filename="a.txt" Content-Type: text/plain Content of a.txt. -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file2"; filename="a.html" Content-Type: text/html <!DOCTYPE html><title>Content of a.html.</title> -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file3"; filename="binary" Content-Type: application/octet-stream aωb -----------------------------735323031399963166993862150--
if (image){
のとこではContent-Type指定してあるんですね。CFNetwork -[__NSCFURLLocalSessionConnection _tick_sniffNow] + 348
でNSのプレフィックスが付いているのでobjcから呼ばれた通信でバグっているのはあっているのでしょうか?CoreFoundation _CFRelease + 1252
こっちじゃないかなあAfter you create a task, you start it by calling its resume method. The session then maintains a strong reference to the task until the request finishes or fails; you do not need to maintain a reference to the task unless it is useful to do so for your app’s internal bookkeeping purposes.
大丈夫そうだなあ・・・UIImage
の↓の二つのプロパティは、ドキュメントを素直に読めば片方が nil
のときはもう片方は nil
でないということになると思うんですが、それは保証されているんでしょうか? var cgImage: CGImage? { get }
var ciImage: CIImage? { get }
!
に失敗しない)んでしょうか?より良い書き方がありますか? if let cgImage = uiImage.cgImage { // `cgImage` を使う処理 } else { let ciImage = uiImage.ciImage! // forced unwrap // `ciImage` を使う処理 }
(edited)