小编dea*_*rne的帖子

触摸文件 - 更新其修改的时间戳

有没有一种有效的方法来更新iPad文件系统上文件的最后修改属性,即unix touch命令?

我看过NSFileManager,但没有运气.

iphone objective-c ipad

8
推荐指数
2
解决办法
2211
查看次数

Xcode 中两个目标中的 swift 包导致重复符号

我的项目中有两个框架,每个框架都依赖于同一个 Swift 包(在本例中为 RxSwift,但我认为这并不重要)。

为了构建项目,我必须在两个目标中包含相同的包(通过目标常规设置中的“框架和库”列表) - 否则当我尝试导入包时,它找不到它。

当我运行我的应用程序时,我在控制台中看到如下警告:

objc[79287]: Class _TtC9Alamofire18UploadTaskDelegate is implemented in both

/Users/deanWombourne/Desktop/PackageManagerTest/DerivedData/PackageManagerTest/
Build/Products/Debug-iphonesimulator/Framework1.framework/Framework1 (0x110877e00)

and

/Users/deanWombourne/Library/Developer/CoreSimulator/Devices/2319A320-1A01-4784-B85E-272FF0F999CB/
data/Containers/Bundle/Application/D40DE3EA-DD78-4241-B307-070CDAF8BFA1/PackageManagerTest.app/PackageManagerTest (0x10f9858c8).

One of the two will be used. Which one is undefined.
Run Code Online (Sandbox Code Playgroud)

有时,应用程序会在重复的包中崩溃。

我已经通过构建一个没有重复包问题的版本来测试该应用程序(将所有代码复制/粘贴到同一个目标!)然后它运行良好,所以这与重复包问题有关。

那么,我的问题是什么?

在 Xcode 中有什么方法可以指定一个包将包含在两个目标中,而不是将它复制两次到可执行文件中?

理想情况下,我想将它指定为某种动态库,这样它就不会被嵌入到可执行文件中,而是按需加载 - 但此时欢迎任何解决方案!


编辑

如果我只有一个框架,但它与主应用程序目标共享 RxSwift 包依赖项,我也会遇到此问题。

xcode ios swift rx-swift swift-package-manager

8
推荐指数
1
解决办法
3230
查看次数

字符串搜索土耳其无点我

使用代码Ç?naralt? Café在文本中搜索文本时Ci

NSStringCompareOptions options =
    NSCaseInsensitiveSearch |
    NSDiacriticInsensitiveSearch |
    NSWidthInsensitiveSearch;
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"tr"];
NSRange range = [haystack rangeOfString:needle 
                                options:options
                                  range:NSMakeRange(o, haystack.length)
                                 locale:locale];
Run Code Online (Sandbox Code Playgroud)

我得到了range.location平等NSNotFound.

这与初始Ç上的变音符号无关,因为我得到了相同的结果,搜索alti唯一奇怪的字符是ı.我也得到一个有效的匹配搜索Cafe包含变音符号(é).

苹果文档提到这种情况作为locale参数的注释,我我正在关注它们.虽然我猜我不是因为它不起作用.

如何搜索"i"以匹配"i"和"ı"?

turkish localization objective-c nsstring ios

7
推荐指数
1
解决办法
1144
查看次数

为什么这个开关在不详尽的情况下编译?

我有这个Result枚举:

public enum Result<T> {
    case success(T)
    case failure(Error)
}
Run Code Online (Sandbox Code Playgroud)

并希望实施CustomStringConvertible,所以我做到了.(不要在这里戳洞,这个问题已被简化:):

extension Result: CustomStringConvertible {

    public var description: String {
        switch self {
        case .success(let value as CustomStringConvertible):
            return "Result.success(\(value.description))"
        case .success(let value):
            return "Result.success(\(value))"
        case .failure(let error as CustomStringConvertible):
            return "Result.failure(\(error.description))"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Playground中运行它完全符合要求.但是,它在决赛中出错了r.description.(同样的运行时故障发生在我的应用程序中,所以它与在操场上无关.)

var r: Result<String> = .success("hello")
r.description

r = .failure(NSError(domain: "", code: 0, userInfo: nil))
r.description

struct MyError: Error { }
r = .failure(MyError())
r.description
Run Code Online (Sandbox Code Playgroud)

经过大量的讨论和设置代码后,我发现它是因为MyError没有实现CustomStringConvertible,所以交换机中的任何情况都不匹配.我认为这意味着从该方法返回垃圾.

那么,有谁知道为什么这个开关编译? …

switch-statement swift

7
推荐指数
1
解决办法
133
查看次数

测试异常时,XCode上的代码覆盖率不正确

我正在为iOS创建一个静态库,我正在尝试为它的单元测试获取代码覆盖率数据.我正在使用CoverStory来可视化生成的代码覆盖文件.

我得到了大多数测试的正确信息.

但是,任何验证应该抛出异常的测试都没有被标记为已测试.

例如,该方法

- (void)shouldThrow:(BOOL)throw {

    if (throw)
       @throw [NSException exception...];

    NSLog(@"not thrown");

}
Run Code Online (Sandbox Code Playgroud)

经测试测试

- (void)testShouldThrow {
    STAssertThrows( [myObject shouldThrow:YES], @"Should have thrown an exception");

    STAssertNoThrow( [myObject shouldThrow:NO], @"Should not have thrown an exception");
}
Run Code Online (Sandbox Code Playgroud)

通过所有测试(即正确抛出异常).但是,代码覆盖率不会显示为100% - 带有@throwon 的行未标记为已测试.

有任何想法吗?

xcode unit-testing code-coverage objective-c ios

6
推荐指数
1
解决办法
965
查看次数

当枚举实现协议时,在switch中匹配枚举值

我有一个协议

protocol P { }
Run Code Online (Sandbox Code Playgroud)

它由枚举实现

enum E: P {
    case a
    case b
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

我希望能够接收实例P,并返回一个特定值,如果它是E(将来会有其他枚举/结构等实现P).

我试过这个:

extension P {

    var value: String {
        switch self {
            case E.a: return "This is an E.a"
            default: return "meh"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不编译

error: Temp.playground:14:16: error: enum case 'a' is not a member of type 'Self'
    case E.a: return "hello"
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

 case is E.a: return "This is an E.a"
Run Code Online (Sandbox Code Playgroud)

这只是给出了这个错误:

 error: Temp.playground:14:19: error: enum element 'a' is …
Run Code Online (Sandbox Code Playgroud)

switch-statement swift

6
推荐指数
1
解决办法
358
查看次数

无法在命令行上从Xcode导出存档

我有一个项目,我正在尝试导出企业归档.

这通过Xcode的界面(的Xcode 9.3版本(9E145))的作品完美,但我想通过命令行(这样我就可以自动完成这一对我们的CI)来做到这一点.

我正在从Xcode内部导出相同的存档,所以我有理由相信存档本身已经正确创建.

我正在运行的命令是

xcodebuild "-exportArchive" "-archivePath" "archive.xcarchive" -exportPath . -exportOptionsPlist ./export_options.plist
Run Code Online (Sandbox Code Playgroud)

而export_options.plist的内容是

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>compileBitcode</key>
        <false></false>
        <key>method</key>
        <string>enterprise</string>
        <key>provisioningProfiles</key>
        <dict>
            <key>com.correct.app.identifier</key>
            <string>XC iOS: com.correct.app.identifier</string>
        </dict>
        <key>signingCertificate</key>
        <string>iPhone Distribution: MYBRAND</string>
        <key>teamID</key>
        <string>ABCDEFGHI</string>
    </dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

2018-04-07 16:54:02.104 xcodebuild[67144:5293266] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path '/var/folders/c4/t3_jplmx5qn7dkxx95rqv2qh0000gn/T/MyBrand_2018-04-07_16-54-02.095.xcdistributionlogs'.
2018-04-07 16:54:04.108 xcodebuild[67144:5293266] [MT] IDEDistribution: Step failed: <IDEDistributionSigningAssetsStep: 0x7fbf2ad5b240>: Error Domain=IDEDistributionSigningAssetStepErrorDomain Code=0 "Locating signing assets failed." UserInfo={NSLocalizedDescription=Locating signing assets failed., IDEDistributionSigningAssetStepUnderlyingErrors=( …
Run Code Online (Sandbox Code Playgroud)

xcode provisioning-profile ios-provisioning xcode9.3

6
推荐指数
0
解决办法
998
查看次数

DYLD_PRINT_STATISTICS没有显示任何内容

我试图在从静态库迁移到框架之后对应用程序启动进行分析.我们有30个左右的框架(fyi:cocoapods),所以我想检查它是否影响性能.团队中的轶事测试说它不是,但我也想要一些数字!

我添加了环境变量DYLD_PRINT_STATISTICSDYLD_PRINT_LIBRARIES查看链接器正在做什么,但我得到的所有输出都来自DYLD_PRINT_LIBRARIES变量.我可以看到框架正确加载,但没有得到它们的统计信息.

我已经尝试重新启动设备以确保框架已经不在内存中但是没有帮助.

关于为什么我没有得到任何输出的任何其他建议DYLD_PRINT_STATISTICS

xcode dynamic-linking dyld ios

5
推荐指数
2
解决办法
5103
查看次数

将选择器转发到Swift中的多个对象

我正在尝试在Swift中重新实现一个类,但遇到了问题.我的模式是有一个对象,它将协议中的方法转发给多个其他对象.

我有一个协议,看起来像:

@protocol AnalyticsProvider {
@optional

    - (void)showHomePage;
    - (void)selectedMenuItem:(NSString *)item;

    // ...
    // 100 or so more methods :sigh:
    // ...

@end
Run Code Online (Sandbox Code Playgroud)

我的想法是,我可以调用showHomePage单例并将其转发给多个对象,每个对象都会使用该消息执行自己的操作.

我会在启动时配置单例,如下所示:

[AppAnalytics sharedAnalytics] setProviders:@[ myFlurryProvider, myOmnitureProvider] ];
Run Code Online (Sandbox Code Playgroud)

其中myFlurryProvider和myOmnitureProvider是AnalyticsProvider协议的真正实现者.然后在我的视图控制器中我会有这样的行:

[[AppAnalytics sharedAnalytics] showHomePage];
Run Code Online (Sandbox Code Playgroud)

例如,这应该将主页分析事件发送到Flurry和Adobe Omniture.这是有效的,因为AppAnalytics该类实现了AnalyticsProvider协议,但实际上并不包含任何方法的代码.

通过forwardInvocation:AppAnalyticsI中实现可以将方法转发给每个提供者,即

- (void)forwardImplementation:(NSInvocation *invocation) {
    for provider in providers
        if ([provider respondsToSelector:invocation.selector])
            [invocation performWithTarget:provider]
}
Run Code Online (Sandbox Code Playgroud)

通过不在我的AppAnalytics单例中实现任何方法,调用被自动传递forwardImplementation:NSInvocation,但是因为AppAnalytics符合协议我在调用时获得编译器安全性.赢了.非常重要的是我不必在AppAnalytics中实际实现任何方法,因为它们有100个并且我不想要那么多重复的代码!

鉴于这NSInvocation是禁止的,在Swift中实现这个的好方法的任何想法!

objective-c ios swift

5
推荐指数
1
解决办法
307
查看次数

将 WKNSURLRequest 转换为崩溃?其他类型

当我尝试强制转换 WKNSURLRequest(和其他类,全部来自 WebKit 框架)时,我遇到了严重的崩溃。

例如在操场上:

import UIKit
import WebKit

final class Sigh: NSObject { }

NSClassFromString("NSObject") as? Sigh.Type

NSClassFromString("WKNSURLRequest") as? Sigh.Type
Run Code Online (Sandbox Code Playgroud)

NSObject 的nil强制转换有效(即返回),但 WKNSURLRequest 的强制转换因 EXC_BAD_ACCESS 而崩溃——我认为它也会返回nil

任何人都知道可能导致这种情况的原因是什么?

casting swift

5
推荐指数
1
解决办法
96
查看次数