Homebrew最近不赞成通过新格式homebrew/versions
提供版本.例如(根据这个答案),你可以做到.homebrew/core
formula@version
brew install postgresql@9.5
当然,这对任意版本都不起作用.例如,install cocoapods@1.1.1
出现"错误:在水龙头中找不到公式".
在旧方法下,我可以运行brew versions <formula>
以查看可用版本.我现在如何列出可用版本?
我们有一个iOS项目。Swift语言版本为4.2。我们以前是在Xcode 10.1中构建它的,没有编译错误。
更新到Xcode 10.2(但保留Swift 4.2)之后,该项目现在充满了诸如Invalid redeclaration of 'variable.storage'
(其中variable
的某些变量的名称)之类的错误。这些错误出现在私有的,用惰性方式初始化的变量旁边,这些变量的名称在整个项目中都是常用的,但不在其范围内重新声明;该错误似乎与storage
消息的一部分有关。清理并重建不能解决问题。有什么建议么?
编辑:这些错误只出现在两个类中。由于所有这些重新声明错误,我还错过了另一个合法的编译错误(Xcode 10.2中的新功能,但足够合法)。经过一番混乱**之后,我发现错误消失了。似乎是编译器中的错误。
**我的混乱步骤是(1)取消嵌套我遇到这些错误的第一个类,(2)创建一个与未编译的类具有相同内容的新类,并指向该类,(3)注释掉失败的类,(4)找到并修复了合法的编译错误。在这一点上,我不需要弄乱另一个也给出了重新声明错误的类。现在已编译代码。因此,(5)恢复了第一类。因此,这些重新声明错误可能只是误导了;如果您找到并修复了所有与迁移相关的错误,希望您不会看到其中任何一个。
我一直在使用NSLock
s来同步敏感的代码部分,但由于它们必须从锁定它们的同一个线程中解锁而一直遇到问题.然后我发现GCD DispatchSemaphore
似乎做了同样的事情,增加了方便性,可以从任何线程发出信号.不过,我想知道,如果这种便利是以线程安全为代价的.更换是否可取
let lock = NSLock()
lock.lock()
// do things...
lock.unlock()
Run Code Online (Sandbox Code Playgroud)
同
let semaphore = DispatchSemaphore(value: 1)
semaphore.wait()
// do things...
semaphore.signal()
Run Code Online (Sandbox Code Playgroud)
或者我会遇到有关线程安全的问题吗?
在 iOS PhotoKit 中,我可以像这样获取所有非空相册:
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "estimatedAssetCount > 0")
let albumFetchResult = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: albumFetchOptions)
albumFetchResult.enumerateObjects({ (collection, _, _) in
// Do something with the album...
})
Run Code Online (Sandbox Code Playgroud)
然后我只能从相册中获取这样的照片:
let fetchOptions = PHFetchOptions()
fetchOptions.predicate = NSPredicate(format: "mediaType = %d", PHAssetResourceType.photo.rawValue)
let fetchResults = PHAsset.fetchAssets(in: collection, options: fetchOptions)
Run Code Online (Sandbox Code Playgroud)
但是第一部分可以给我只有视频的专辑,这意味着在我将谓词应用于第二部分后,专辑将是空的。在我开始使用它们之前,有没有办法过滤掉第一部分中的那些专辑?
我遇到了与 Swift 中的惰性变量相关的崩溃。崩溃的原因很容易理解,但我不知道有什么好方法可以在不失去使用惰性变量获得的优势的情况下防止崩溃。
我有一个类,它在使用时延迟创建服务实例。服务实例启动了就必须停止,但不一定每次都启动。
class MyClass {
lazy var service: MyService = {
// To init and configure this service,
// we need to reference `self`.
let service = MyService(key: self.key) // Just pretend key exists :)
service.delegate = self
return service
}
func thisGetsCalledSometimes() {
// Calling this function causes the lazy var to
// get initialised.
self.service.start()
}
deinit {
// If `thisGetsCalledSometimes` was NOT called,
// this crashes because the initialising closure
// for `service` references `self`. …
Run Code Online (Sandbox Code Playgroud) 最好用一个用例来解释。
我有一个记录器课程。它将消息记录到级别的输出。
class Logger {
var outputs: OutputOptions
var filter: Level
func log(_ message: String, at level: Level) {
if level <= self.filter {
outputs.log(message)
}
}
}
Run Code Online (Sandbox Code Playgroud)
可能的输出由OptionSet定义,并确定应记录到哪些输出(NSLog,Instabug等)消息。OptionSet很不错,因为我可以定义选择多个输出并轻松检查记录时选择了哪个。
struct OutputOptions: OptionSet {
let rawValue: Int
static let console = OutputOptions(1 << 0)
static let instabug = OutputOptions(1 << 1)
func log(_ message: String) {
if self.contains(.console) {
NSLog(message)
}
// etc
}
}
Run Code Online (Sandbox Code Playgroud)
级别由枚举定义,表示消息的级别,例如错误,警告,信息等。如果我们对获取详细的输出不感兴趣,记录器可以过滤出特定级别以上的消息。记录器的过滤器也设置为一个级别。
enum Level: Int {none, no logs are shown. */
case none = 0
case error …
Run Code Online (Sandbox Code Playgroud) 我在 Xcode 中为临时分布式目标创建了一个共享扩展目标。为了在主应用程序和扩展程序之间共享用户默认值,我为两个目标启用了应用程序组功能,添加了一个新的应用程序组。
现在,当我在项目配置视图中查看共享目标时,看到以下错误:
供应配置文件“我的临时配置文件”不支持应用程序组功能。
配置配置文件“我的临时配置文件”不支持应用程序组。
供应配置文件“我的临时配置文件”不包括我的应用程序组组权利。
这是有道理的;当我查看目标的功能选项卡并展开应用程序组权利时,我的新应用程序组以红色突出显示,并在其下方显示以下错误:
将应用组功能添加到您的应用 ID
供应配置文件“我的临时配置文件”不支持应用程序组功能
将应用组添加到您的应用 ID
供应配置文件“我的临时配置文件”不支持应用程序组功能
但是当我导航到 developer.apple.com -> Account -> Certificates, IDs & Profiles -> Identifiers -> My share extension App ID -> App Groups -> Configure 时,我没有看到我创建的 App Group。
如何将我的组添加到开发者控制台,以便我可以选择它作为我的 App ID 的组,以便它在我的配置文件中可用?