Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当最低部署目标设置为iOS 12.2时,如何有条件地使用Combine@Published?_Ios_Swift_Combine - Fatal编程技术网

当最低部署目标设置为iOS 12.2时,如何有条件地使用Combine@Published?

当最低部署目标设置为iOS 12.2时,如何有条件地使用Combine@Published?,ios,swift,combine,Ios,Swift,Combine,我有一个最低部署目标为iOS 12.0的应用程序。有一些部分是用SwiftUI和Combine编写的。使用这两个库的所有方法和类型都标记为@available(iOS 13.0,*)。自1月份以来,该应用程序一直在这种混合设置中运行,没有出现任何问题 为了利用ABI稳定性并减少应用程序大小,我想将新的最小部署目标设置为iOS 12.2 当我这样做时,应用程序在启动时崩溃(iOS 12.4模拟器),并在控制台上打印以下内容: dyld:惰性符号绑定失败:无法解析符号 在/Users/yyyyyyy

我有一个最低部署目标为iOS 12.0的应用程序。有一些部分是用
SwiftUI
Combine
编写的。使用这两个库的所有方法和类型都标记为
@available(iOS 13.0,*)
。自1月份以来,该应用程序一直在这种混合设置中运行,没有出现任何问题

为了利用ABI稳定性并减少应用程序大小,我想将新的最小部署目标设置为iOS 12.2

当我这样做时,应用程序在启动时崩溃(iOS 12.4模拟器),并在控制台上打印以下内容:

dyld:惰性符号绑定失败:无法解析符号 在/Users/yyyyyyyy/Library/Developer/CoreSimulator/Devices/UUD-UUD-UUD-UUD/data/Containers/Bundle/Application/UUD/XXXXXXX.app/XXXXXXX中发布DVMA 因为无法加载依赖的dylib#29,dyld:无法解析 symbol\u$s7Combine9PublishedVMa中 /用户/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 因为无法加载依赖的动态库#29

该应用程序在试图在运行iOS 12.4的iPhone上启动时也会崩溃

如果我从代码中删除所有
@已发布的
,但保留所有其他
组合
SwiftUI
相关位,则该应用程序可以在iOS 12上使用

即使所有包含
@Published
的类都用
@available(iOS 13.0,*)
标记,我还是尝试将它们另外包装在#
if-canImport(Combine)
中,或者将
if-canImport(Combine)
应用于每个
@Published
变量。这没有帮助

我知道我可以改变

@Published var name = ""

但这似乎是一个令人讨厌的解决办法


当设备运行iOS 13.0或更高版本时,如何将部署目标增加到iOS 12.2,并继续使用发布的iOS 13.0或更高版本?

您需要将
组合
(和
SwiftUI
,如果您也在使用该)框架与您的项目弱链接。您可以使用
其他\u LDFLAGS
生成设置来实现这一点

OTHER_LDFLAGS = -weak_framework Combine -weak_framework SwiftUI

实际上不需要
canImport
语句,只需要弱链接框架。当然,对于使用
组合
的所有类型,您仍然需要
@可用的
注释。您不能在低于iOS 13的部署目标中使用属性包装器
@Published
。做到这一点的唯一方法是如上所述

在您的类中(应符合
ObservableObject
协议),而不是:

@Published var name=“”
你必须有:

var name=“”{
意志{
如果可用(iOS 13.0、OSX 10.15、tvOS 13.0、watchOS 6.0、*){
self.objectWillChange.send()
}
}
}
您可能还需要在类中显式添加
objectWillChange
声明:

@可用(iOS 13.0、OSX 10.15、tvOS 13.0、watchOS 6.0、*)
public lazy var objectWillChange=observeObjectPublisher()

我已经做到了。对不起,我忘了在我的问题中提到它。如果没有弱链接,则在iOS 13下使用Combine/SwiftUI和target根本不起作用。我的问题似乎与@Published specifically有关。你能解决这个问题吗?不幸的是,可选组合和“@Published”也有同样的问题,我不得不删除@Published并使用willSet,然后从那里发送objectWillChange。这是一个小问题!谢谢
OTHER_LDFLAGS = -weak_framework Combine -weak_framework SwiftUI